HTML :: TreeBuilder :: XPath缺少结果中的最后一个标记
问题描述:
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缺少结果中的最后一个标记
答
默认情况下,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';
。
原始HTML源代码包含结束标记。 – CJ7
@ CJ7,你有什么意见? – ikegami