【发布时间】:2011-10-09 03:47:33
【问题描述】:
我正在使用 XML::LibXML 来解析一大段 html,以更改所有锚元素的 title 属性。 问题是 XML::LibXML 篡改了未编码的实体,并将例如 '&' 更改为 '&'在 href 属性中的 url 参数中。
我如何告诉 XML::LibXML 不要尝试对这些实体进行编码或解码?
#!/usr/bin/perl -w
use strict;
use XML::LibXML;
my $parser = XML::LibXML->new(recover => 2);
my $html = '
<div>
<span>this & that & what?</span>
<a title="link1" href="http://url.com/foo?a=1&b=2">Link1</a>
<a title="link2" href="http://url.com/foo?a=1&b=2">Link2</a>
</div>';
my $doc = $parser->load_html(string => $html);
for my $node ($doc->findnodes('//*[@title]')) {
$node->setAttribute('title', 'newtitle');
}
print $doc->toString(), "\n";
__END__
产生这个输出:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>
<span>this & that & what?</span>
<a title="newtitle" href="http://url.com/foo?a=1&b=2">Link1</a>
<a title="newtitle" href="http://url.com/foo?a=1&b=2">Link2</a>
</div></body></html>
正如您将看到的那样,XML::LibXML 已经改变了 url,还改变了 span 标签内的文本!
【问题讨论】:
-
嗯,基本上,您的输入不是有效的 XML。 Perl 有 HTML 解析器,也许试试其中之一? (虽然,它也不是有效的 HTML,但 HTML 解析器通常更宽容)
-
@derobert,XML::LibXML 的
load_html是一个 HTML 解析器。 -
@derobert — 它也不是有效的 HTML。
-
所以您想在保留错误的同时操作 HTML?我怀疑你会找到任何可以让你这样做的解析器。
-
@ikegami:由于 URL,它不是有效的 HTML。
&b不是有效实体。我很确定这在 XHTML 之前就是如此。另外,请记住 HTML 标准以奇怪的方式使用“应该”;例如,您只应该使用 <以避免与标签的开头混淆(HTML4 §5.3.2)。您需要检查 SGML 标准才能确定。
标签: perl xml-libxml