2014-04-01 34 views
0

我無法從HTML表格中恢復數據。 這是我的。perl HTML :: TableExtract超出範圍錯誤

use strict; 
use warnings; 
use HTML::TreeBuilder; 
use HTML::TableExtract qw(tree); # 
use WWW::Mechanize; 

my $d = 3; 
my $c = 4; 

$te = HTML::TableExtract->new(depth => $d, count => $c); # , decode => 1, gridmap => 1 
$te->parse($mech->content); 
print "\nDepth = $d, Count = $c \n\n"; 
my $table = $te->first_table_found; 
my $table_tree = $table->tree(); 
my @rows = $table->rows(); 
print "The row count is : ".$rowcount,"\n"; 
print "The column count is: ".$colcount,"\n"; 
foreach my $row (@rows) 
{ 
    my @read_row = $table->tree->row($row); 
    foreach my $read (@read_row) 
    { 
     print $read, "\n"; 
    } 
} 

我把這個作爲錯誤信息。

"Rows(ARRAY(0x2987ef8)) out of range at test4.pl line 91." 

有沒有更好的方法來查看錶格並獲取值。 我有沒有標題尋找,我看過HTML::Query,但無法找到它或所需的Badger::Base通過PPM和HTML::Element看起來像它更好地用於表建設。 我在腳本的前面也使用了WWW::Mechanize

任何幫助我上面的代碼將不勝感激。

回答

1

對於大多數目的,您並不需要樹提取模式

總是use strictuse warnings在你寫的每一個Perl程序的頂部,並聲明變量儘可能接近要利用自己的第一點。

您的通話$table->rows()返回數組列表引用,你可以像這樣訪問

my $te = HTML::TableExtract->new(depth => $d, count => $c); # , decode => 1, gridmap => 1 
$te->parse($mech->content); 
printf "\nDepth = %d, Count = %d\n\n", $d, $c; 

my $table = $te->first_table_found; 
my @rows = $table->rows; 

for my $row (@rows) { 
    print join(', ', @$row), "\n"; 
} 
+0

感謝鮑羅廷。在我嘗試刪除代碼時,我忘記了模塊,並嚴格使用警告。他們在我的實際代碼:)。我用這個代碼通過HTML :: ElementTable :: DataElement = HASH(0x3b91ff8)得到了一個數據元素哈希引用,就像這個一樣。任何想法如何解決這個問題。 – MicrobicTiger

+0

@MicrobicTiger:你有沒有從'HTML :: TableExtract'中移除'tree'?正如我所說的,你不需要它,它只是使代碼更復雜。你似乎也缺少'$ te'的聲明,或者至少它不是它應該在的地方。你應該把它放在第一次使用的地方,就像我在自己的代碼中一樣。 – Borodin

+0

啊,我看到了問題。 我有一些未初始化的值,但效果更好。謝謝@Borodin,在過去的幾天中,我已經感謝您的幫助。 – MicrobicTiger