BeautifulSoup可以保存CDATA部分吗?

时间:2013-05-07 18:56:34

标签: python xml beautifulsoup lxml cdata

我正在使用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用strip_cdata=False初始化lxml?

1 个答案:

答案 0 :(得分:4)

在我的情况下,如果我使用

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

然后cdata被保留并可访问。