使用XML :: LibXML解析html而不触及实体

时间:2011-10-09 03:47:33

标签: perl xml-libxml

我正在使用XML :: LibXML来解析一大块html,以便更改所有锚元素的title属性。 问题是XML :: LibXML篡改了未编码的entites,并改变了例如'&'到'& amp;'在href属性的url params中。

我如何告诉XML :: LibXML不要尝试编码或解码任何这些权利?

#!/usr/bin/perl -w

use strict;
use XML::LibXML;

my $parser = XML::LibXML->new(recover => 2);

my $html = '
<div>
    <span>this & that &amp; 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 &amp; that &amp; what?</span>
    <a title="newtitle" href="http://url.com/foo?a=1&amp;b=2">Link1</a>
    <a title="newtitle" href="http://url.com/foo?a=1&amp;b=2">Link2</a>
</div></body></html>

正如您将看到的那样,XML :: LibXML已经更改了网址,以及span标记内的文字!

1 个答案:

答案 0 :(得分:2)

正如您将看到的那样,XML :: LibXML已经更改了URL,以及span标记内的文本!

你错了。该网址更改。原始HTML和生成的HTML都生成相同的URL(http://url.com/foo?a=1&b=2)。 HTML不同,但显示的文字不是。

跨度中的文字也是如此。原始HTML和生成的HTML都生成相同的URL(this & that & what?)。 HTML不同,但URL不是。

据我所知,没有办法控制XML :: LibXML的toString转义的字符。显然,即使在HTML中技术上不需要它,它也会选择逃避&amp;

为什么不呢? “&”逃脱没有任何害处。

«this & that &amp; what?»和«this &amp; that &amp; what?»在HTML中的含义相同。

«href="http://url.com/foo?a=1&amp;b=2"»和«href="http://url.com/foo?a=1&b=2"»在HTML中的含义相同。

PS - 如果您要制作HTML,则应该使用->toStringHTML(),而不是->toString()。后者产生XML。