【问题标题】:Can CDATA sections be preserved by BeautifulSoup?BeautifulSoup 可以保留 CDATA 部分吗?
【发布时间】:2013-05-01 20:19:54
【问题描述】:

我正在使用 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?

【问题讨论】:

标签: python xml beautifulsoup lxml cdata


【解决方案1】:

如果我使用

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

然后 cdata 被保留并可以访问。

【讨论】:

  • 如果您使用lxml-xml,则&lt;![CDATA[...]]&gt; 周围的文本将被删除,您只剩下内容。如果要保留&lt;![CDATA[]]&gt; 文字,可以使用html.parser
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2011-05-26
  • 2013-03-19
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多