1

我正在尝试从http://www.soccerbase.com/tournaments/tournament.sd?comp_id=1从第 1184 行到第 1325 行抓取信息,基本上是接下来 7 天即将到来的比赛。我的代码适用于单个实例,但我不知道如何迭代代码,以便它会刮掉所有游戏信息,直到它达到 7 天的游戏价值。我是否可以创建某种循环,直到我点击某个标签或其他东西?到目前为止,这是我的代码,在此先感谢!

my $page = WWW::Mechanize->new;

$page->get('http://www.soccerbase.com/tournaments/tournament.sd?comp_id=1');

my $stream = HTML::TokeParser->new(\$page->{content});
my @fixture;
my $tag = $stream->get_tag("td");
while($tag->[1]{class} ne "dateTime"){
    $tag = $stream->get_tag("td");   
}

if ($tag->[1]{class} eq "dateTime") {
    push(@fixture, $stream->get_trimmed_text("/a"));
}

$stream->get_tag("a");
$stream->get_tag("a");
push(@fixture, $stream->get_trimmed_text("/a"));

$stream->get_tag("a");
push(@fixture, $stream->get_trimmed_text("/a"));  

foreach $element (@fixture){
print $element, "\t";
}
print "\n";  
4

1 回答 1

3

尝试使用 Web::Query来解析 HTML,它比 TokeParser 好用得多。它以声明式而不是命令式工作,您可以使用 CSS 表达式选择元素。

如果有 score v,则将该行添加到结果集中,否则丢弃该行。

use Web::Query 'wq';
my $football_matches = wq($mech->content)
    ->find('tr.match')
    ->map(sub {
        my (undef, $e) = @_;
        return 'v' eq $e->find('td.score')->text
            ? [
                $e->attr('id'),
                map { $e->find("td.$_")->text }
                  (qw(tournament dateTime homeTeam score awayTeam prices))
            ]
            : ();
    });
use Data::Dumper; print Dumper $football_matches;

$VAR1 = [
    ['tn7gc635476', '', ' Mo 12Mar 2012 ', 'Arsenal',   'v', 'Newcastle', '  '],
    ['tn7gc649937', '', ' Tu 13Mar 2012 ', 'Liverpool', 'v', 'Everton',   '  '],
    ['tn7gc635681', '', ' Sa 17Mar 2012 ', 'Fulham',    'v', 'Swansea',   '  '],
    ['tn7gc635661', '', ' Sa 17Mar 2012 ', 'Wigan',     'v', 'West Brom', '  '],
    ['tn7gc635749', '', ' Su 18Mar 2012 ', 'Wolves',    'v', 'Man Utd',   '  '],
    ['tn7gc635556', '', ' Su 18Mar 2012 ', 'Newcastle', 'v', 'Norwich',   '  ']
];
于 2012-03-12T18:33:12.560 回答