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