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> тег. Зачем? Это намеренно или это ошибка в модуле?

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, Полезное значение для передачи - пустой хеш-адрес, {}, что означает, что никакие конечные теги не являются обязательными для этого дампа.

Например:

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 конечный тег является необязательным для элементов P.

Другие вопросы по тегам