如何使用HTML :: TokeParser提取数据

时间:2011-07-22 16:52:41

标签: perl

我想编写代码以从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”

  1. $ year赢得奥斯卡$ category $ recipient1..n
  2. $ year提名奥斯卡$ category $ recipient1..n
  3. $ year赢得金球奖$ category $ recipient1..n
  4. $ year提名金球奖$ category $ recipient1..n
  5. 我不确定这是否是最有效的方法,但我也尝试过HTML :: TableExtract,但成功率却低得多。

    感谢。

1 个答案:

答案 0 :(得分:1)

tokeparser是低级别的,tokeparser是有人可能用来实现HTML :: TreeBuilder,你想使用HTML :: TreeBuilder :: XPath,结合firefox插件xpather,你最终会得到像

这样的东西
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 } ,
);