4

我正在使用 BeautifulSoup 来读取、修改和编写 XML 文件。我在删除 CDATA 部分时遇到问题。这是一个简化的例子。

罪魁祸首 XML 文件:

<?xml version="1.0" ?>
<foo>
    <bar><![CDATA[
        !@#$%^&*()_+{}|:"<>?,./;'[]\-=
    ]]></bar>
</foo>

这是 Python 脚本。

from bs4 import BeautifulSoup

xmlfile = open("cdata.xml", "r") 
soup = BeautifulSoup( xmlfile, "xml" )
print(soup)

这是输出。请注意缺少 CDATA 部分标记。

<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar>
        !@#$%^&amp;*()_+{}|:"&lt;&gt;?,./;'[]\-=
    </bar>
</foo>

我也尝试打印soup.prettify(formatter="xml")并得到相同的结果,但空白略有不同。文档中没有太多关于阅读 CDATA 部分的内容,所以也许这是一lxml件事?

有没有办法告诉 BeautifulSoup 保留 CDATA 部分?

更新是的,这是一个 lxml 的东西。 http://lxml.de/api.html#cdata 所以,问题就变成了,是否可以告诉 BeautifulSoup 用 初始化 lxml strip_cdata=False

4

1 回答 1

6

就我而言,如果我使用

soup = BeautifulSoup( xmlfile, "lxml-xml" )

然后 cdata 被保留并可访问。

于 2015-12-26T21:00:23.087 回答