2016-05-31 9 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';.