Perl: проблемы с WWW: механизация и форма - PullRequest
2 голосов
/ 27 января 2012

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

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

3 голосов
/ 27 января 2012

Это немного сложно, потому что действие формы воспроизводит JavaScript с помощью 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 голос
/ 27 января 2012

Похоже, что элементы формы не имеют атрибутов имени, и я предполагаю, что строка запроса формируется другими способами путем перевода атрибутов 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";
1 голос
/ 27 января 2012

Проще всего посмотреть на HTTP-запрос, который он делает, например:

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

'kkkk' - имя игрока, используйте LWP::UserAgent чтобы сделать этот запрос, и он даст вам результат, замените 'kkk' на имя игрока, для которого вы хотите получить информацию, и он выполнит свою работу, если использовать мех для этого - излишество, если выспросите меня, убедитесь, что если в имени игрока есть пробелы и т.д., закодируйте его.

...