2011-07-22 19 views
0

imdb.com Awardsセクションから特定の情報を抽出するためのコードを記述します。以下では、私は全体HTML :: TokeParserを使用してデータを抽出する方法

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

     } 
    } 

} 

としてテキストを印刷することができますが、それらのほとんどは、各「カテゴリのループを定義する方法も同じタグを持っているので、私は別のトークンを分離する方法がわからないスニペット/ recipient 'と入力し、改行があればそれを印刷します。

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(); 

印刷 "の$年間$結果$賞$カテゴリ$受信者\ n" は

  1. $年度ウォンオスカー$カテゴリの$ recipient1..n
  2. など
  3. $は今年ノミネートオスカー$カテゴリの$ recipient1..n
  4. など
  5. $年度ウォンゴールデングローブ$カテゴリの$ recipient1..n
  6. など
  7. $年度ノミネートゴールデングローブ$カテゴリの$ recipient1..n
  8. など

私は、これが最も効率的な方法があるのか​​はわからないが、私はまた、多くのとHTML :: TableExtractを試してみました少ない成功。

ありがとうございました。

答えて

1

tokeparserは、tokeparserは、あなたがFirefoxのプラグインxpatherと結合し、HTML :: TreeBuilder :: XPathを使用したい、誰かがHTML :: TreeBuilderを実装するために使うかもしれないものの低レベルでされ、あなたは

のようなもので終わりますチームの
for my $result ($tree->findnodes(q{id('tn15content')//table//td})) { 
    print $result->as_trimmed_text,"\n"; 
} 

のxpathなく、かなりあなたのカップ、私はあなたが単純なHTMLと

pQuery($content) 
->find('#tn15content') 
->find('td') 
->each(sub{ 
    print pQuery($_)->text, "\n" 
}); 

pQuery

と類似または同じ行う可能性が確信している:: TreeBuilder look_down

$tree->look_down(id => 'tn15content') 
->look_down(qw/_tag td /, 
    sub { print $_[0]->as_trimmed_text, "\n"; return } , 
);