我正试图从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";
答案 0 :(得分:3)
尝试使用Web::Query来解析HTML,它比TokeParser更好用。它使用声明而不是命令,你用CSS表达式选择元素。
如果得分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', ' ']
];