2011-07-22 55 views
0

我想編寫一個代碼從imdb.com獎項部分提取特定信息。隨着下面的代碼片段,我可以打印文本作爲一個整體如何使用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"; 

     } 
    } 

} 

,但我不知道如何將不同的令牌分開,因爲他們大多具有相同的標籤,以及如何定義循環的每個「類別/收件人'並在新行上打印(如果存在)。

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. $年提名奧斯卡$類別$ recipient1..n
  3. $年榮獲金球獎$類別$ recipient1..n
  4. $年提名金球獎$類別$ recipient1..n

我不知道這是否是最有效的方法,但我也嘗試過HTML :: TableExtract與多較少的成功。

謝謝。

回答

1

tokeparser爲低電平,tokeparser是什麼,你要使用HTML :: TreeBuilder作爲:: XPath中,用Firefox插件xpather結合有人可能會用它來實現HTML :: TreeBuilder作爲,和你結束了類似

團隊的
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 } , 
);