我想编写代码以从imdb.com奖励部分中提取特定信息。使用下面的代码片段,我可以整体打印文本
use strict;
use warnings;
use autodie;
use utf8;
use WWW::Mechanize;
use HTML::TokeParser;
#Example
my $url = 'http://www.imdb.com/title/tt1375666/awards';
my $mech = WWW::Mechanize->new;
$mech->agent_alias( 'Windows Mozilla' );
$mech->get( $url );
if ($mech->find_link(text_regex => qr/(?:Academy Awards|Golden Globes)/i)) {
my $tp = HTML::TokeParser->new(\$mech->content);
while (my $token = $tp->get_tag('big')) {
$token = $tp->get_trimmed_text('big');
if ( $token =~ /(?:Academy Awards|Golden Globes)/ ) {
print "$token\n";
}
}
}
但我不知道如何分隔不同的令牌,因为它们中的大多数都有相同的标签,以及如何为每个“类别/收件人”定义循环,如果存在则在新行上打印。
my $year = $tp->get_trimmed_text();
my $result = $tp->get_trimmed_text();
my $award = $tp->get_trimmed_text();
my $category = $tp->get_trimmed_text();
my $recipient = $tp->get_trimmed_text();
打印“$ year $ result $ award $ category $ recipient \ n”
我不确定这是否是最有效的方法,但我也尝试过HTML :: TableExtract,但成功率却低得多。
感谢。
答案 0 :(得分:1)
for my $result ( $tree->findnodes(q{id('tn15content')//table//td}) ) {
print $result->as_trimmed_text,"\n";
}
xpath不是你的团队,我相信你可以用pQuery做类似的事情
pQuery( $content)
->find('#tn15content')
->find('td')
->each(sub{
print pQuery($_)->text, "\n"
});
或与纯HTML :: TreeBuilder look_down相同
$tree->look_down( id => 'tn15content' )
->look_down( qw/_tag td /,
sub { print $_[0]->as_trimmed_text, "\n"; return } ,
);