0

我有以下代码来访问 HTML 表。

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

但是文本没有格式化,因为网页使用表格边框来划分某些文本。所以它出现了这样的情况,“乔丹斯敦的计算数学”,我假设乔丹斯敦在下一个单元格中。这是我正在使用的代码,

my @array; 
my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");




    for ($table ->look_down(_tag => 'tr')) {

                push(@array,$_->as_text());

    }

    foreach(@array){
           print $_, " ";
                    }
$tree->delete();

请注意,我尝试使用和数组分隔文本但没有运气?任何指针。谢谢

4

2 回答 2

1

如果调用树上的objectify_text方法,访问 HTML 树的文本节点会容易得多。这会将文本节点从简单的字符串更改为HTML::Element具有伪标记名称的实例~text和一个称为text等于文本字符串的属性。这允许该look_down方法搜索文本节点。

如果您像这样重新编码,您将获得推送到数组中的每个单独文本节点的值。

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
$tree->objectify_text;

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

my @text; 

for my $tr ($table->look_down(_tag => '~text')) {
  my $text = $tr->attr('text');
  push @text, $text if $text =~ /\S/;
}

print "$_\n" for @text;
于 2012-04-06T23:49:17.940 回答
0

使用 HTML::TreeBuilder::XPath

我建议为此使用 Perl 模块HTML::TreeBuilder::XPath。它应该给你你想要的。

从文档中,我相信您的代码使用 XPath 模块看起来像这样

my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my @trArray = $tree->findnodes_as_string( '//table[@id="moduleDetail"]/tr/td');
$tree->delete();

有关 XPath 的更多信息,请参见http://www.w3schools.com/xpath/

使用 HTML::TreeBuilder

如果您想坚持使用HTML::TreeBuilder,那么您需要执行以下操作

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");
for ($table->look_down(_tag => 'td')) {
  push(@array,$_->as_text());   
}
于 2012-04-06T19:32:42.157 回答