2014-04-01 35 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