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>标记。为什么?这是故意的还是模块中的错误?

4

2 回答 2

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';

于 2016-06-01T20:59:23.430 回答
0

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

于 2016-05-31T02:12:36.607 回答