2016-05-31 98 views
0
use WWW::Mechanize; 
use HTML::TreeBuilder::XPath; 
my $mech = new WWW::Mechanize; 
my $tree = new HTML::TreeBuilder::XPath; 
my $url = "http://www.elaws.gov.bw/wondersbtree.php"; 
$mech->get($url); 
$tree->parse($mech->content()); 
@nodes = $tree->findnodes("//p[font = 'PRINCIPAL LEGISLATION']"); 
print @nodes[0]->as_HTML; 

上述代码打印出搜索到的HTML元素,但缺少最终的</p>标记。为什么?这是故意的还是模块中的错误?HTML :: TreeBuilder :: XPath缺少结果中的最后一个标记

回答

0

在HTML中,结束标记对于P elements是可选的。

+0

原始HTML源代码包含结束标记。 – CJ7

+0

@ CJ7,你有什么意见? – ikegami

2

默认情况下,as_HTML方法省略某些可选的结束标签:

as_HTML

$s = $h->as_HTML(); 
$s = $h->as_HTML($entities); 
$s = $h->as_HTML($entities, $indent_char); 
$s = $h->as_HTML($entities, $indent_char, \%optional_end_tags); 

[...]

如果指定和定义\%optional_end_tags,它应该作为一个散列的引用,该散列对于每个结束标记是可选的标记名称都包含真值。默认为\%HTML::Element::optionalEndTag,这是%HTML::Tagset::optionalEndTag的别名,在撰写本文时,其中包含p, li, dt, dd的真实值。一个有用的值是一个空的hashref,{},这意味着这个转储没有可选的结束标签。

例如:

use strict; 
use warnings 'all'; 
use 5.010; 

use HTML::TreeBuilder::XPath; 

my $tree = HTML::TreeBuilder::XPath->new_from_content('<p>foo</p>'); 
my @nodes = $tree->findnodes('//p'); 

say $nodes[0]->as_HTML(undef, undef, {}); 

输出:

<p>foo</p> 

注意,你应该总是use strict;use warnings 'all';