2012-01-27 80 views
2

我想写一个脚本,通过一个足球网站导航到我选择的玩家,并为我们刮取他们的信息。我通过对单个玩家的页面进行硬编码来工作,但尝试实现导航会给我带来一些问题。有问题的网站是http://www.soccerbase.comPerl:WWW的问题:机械化和表格

我必须填写一张表格,并在页面顶部显示玩家的姓名,然后将其提交以供搜索。我尝试了两种不同的方式(根据我在网上找到的信息评论其中之一),但无济于事。当谈到Perl时,我绝对是新手,所以任何帮助都将不胜感激!提前致谢。这里是我的代码:

#!/usr/bin/perl 
use strict; 

require WWW::Mechanize; 
require HTML::TokeParser; 

my $player = 'Luis Antonio Valencia'; 
#die "Must provide a player's name" unless $player ne 1; 

my $agent = WWW::Mechanize->new(); 
$agent->get('http://www.soccerbase.com/players/home.sd'); 
$agent->form_name('headSearch'); 
$agent->set_fields('searchTeamField', $player); 
$agent->click_button(name=>"Search"); 

#$agent->submit_form(
#  form_number => 1, 
#  fields => { => 'Luis Antonio Valencia', }  
# ); 

my $stream = HTML::TokeParser->new(\$agent->{content}); 
my $player_name; 

$stream->get_tag("strong"); 
$player_name = $stream->get_trimmed_text("/strong"); 

print "\n", "Player Name: ", $player_name, "\n"; 

回答

3

这有点棘手,因为形式的行动起着switcharoo使用Javascript,但HTML::Form是能够处理完美的罚款:

#!/usr/bin/env perl 
use WWW::Mechanize qw(); 
use URI qw(); 

my $player = 'Luis Antonio Valencia'; 
my $agent = WWW::Mechanize->new; 
$agent->get('http://www.soccerbase.com/players/home.sd'); 
my $form = $agent->form_id('headSearch'); 
{ 
    my $search_uri = $agent->uri; 
    $search_uri->path('/players/search.sd'); 
    $form->action($search_uri); 
    # requires absolute URI 
} 
$agent->submit_form(
    fields => { 
     search => $player, 
     type => 'player', 
    } 
); 
1

更简单的方法是看它使HTTP请求,例如:

http://www.soccerbase.com/players/search.sd?search=kkkk&type=player

'KKKK' 是玩家的名字,使用LWP::UserAgent如果你问这个请求,它会给你结果,把'kkk'改成你正在寻找信息的玩家的名字,并且这将完成这项工作,使用Mech是一种矫枉过正,如果你问我,确保如果玩家的名字有空格,对它进行编码。

1

它看起来像表单元素不具有名称属性和我假设查询字符串是通过翻译id一些其他手段形成属性产生:

http://www.soccerbase.com/players/search.sd?search=Luis+Antonio+Valencia&type=player

你会觉得以下是可行的,但它并不暗示在幕后发生了其他一些JavaScript优点(!)。

#!/usr/bin/env perl 

use strict; 
use warnings; 

use HTML::TableExtract; 
use LWP::Simple qw(get); 
use URI; 

my $player = 'Luis Antonio Valencia'; 

my $uri = URI->new('http://www.soccerbase.com/players/home.sd'); 
$uri->query_form(
    search => $player, 
    type => 'player', 
); 

my $content = get "$uri"; 
die "Failed to get '$uri'\n" unless defined $content; 

my $te = HTML::TableExtract->new(
    attribs => { class => 'clubInfo' }, 
); 

$te->parse($content); 
die unless $te->tables; 

my ($table) = $te->tables; 
my ($row) = $table->rows; 

print $row->[1], "\n";