2012-01-27 3 views
2

Я пытаюсь написать сценарий, который будет перемещаться по футбольному веб-сайту игроку по моему выбору и очистить их информацию для меня. У меня есть скребковая часть, работающая только с жестким кодированием страницы отдельного игрока, но попытка реализовать навигацию дает мне некоторые проблемы. Этот веб-сайт: http://www.soccerbase.com.Perl: Проблемы с WWW: Mechanize и форма

Я должен заполнить форму, указанную в верхней части страницы с именем игрока, затем отправьте ее для поиска. Я попробовал это двумя разными способами (комментируя один из них) на основе информации, которую я нашел онлайн, но безрезультатно. Я абсолютный новичок, когда дело доходит до 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, потому что это слишком много, если вы спросите меня, убедитесь, что если имя игрока имеет пробелы, e tc закодировать его.

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"; 
Смежные вопросы