我有以下代码来访问HTML表。
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");
然而,由于网页使用表格边界来划分某些文本片段,因此文本没有格式化。所以它可以归结为这样的东西,"计算jordanstown的数学",我假设jordanstown在下一个单元格中。这是我正在使用的代码,
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();
注意,我试图使用和数组来分隔文本,但没有成功?任何指针。感谢
如果在树上调用objectify_text
方法,访问HTML树的文本节点会变得更容易。这将文本节点从简单字符串更改为具有伪标记名称~text
和与文本字符串相等的名为text
的属性的HTML::Element
实例。这允许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;
使用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());
}