2012-03-12 115 views
1

我想从第1184到1325行的http://www.soccerbase.com/tournaments/tournament.sd?comp_id=1中抓取信息,基本上是未来7天即将到来的游戏。我的代码只针对一个实例工作,但我无法弄清楚如何迭代代码,以便它能够清除所有游戏信息,直到它达到7天的游戏价值。是否有某种形式的循环,我可以创建,将刮,直到我打到某个标签或什么?这是我的代码迄今为止,在此先感谢!WWW ::机械化和迭代

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"; 

回答

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', ' '] 
]; 
+0

非常感谢,这个完美的作品。还有一个问题,如果你不介意,我将如何从上述结构中提取团队名称和日期,以将它们放在正常的字符串变量中?再次感谢! – blacky 2012-03-13 19:26:30

+1

[打开一个新问题](http://stackoverflow.com/questions/ask)。 – daxim 2012-03-13 19:35:51

+0

好的,我已经这么做了! – blacky 2012-03-13 20:53:21