【发布时间】: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>
!@#$%^&*()_+{}|:"<>?,./;'[]\-=
</bar>
</foo>
我还尝试打印 soup.prettify(formatter="xml") 并得到相同的结果,但空格略有不同。文档中没有太多关于阅读 CDATA 部分的内容,所以也许这是 lxml 的事情?
有没有办法告诉 BeautifulSoup 保留 CDATA 部分?
更新是的,这是一个 lxml 的东西。 http://lxml.de/api.html#cdata 那么问题来了,是否可以告诉 BeautifulSoup 用 strip_cdata=False 初始化 lxml?
【问题讨论】:
-
此线程表明 lxml 中存在一个影响此问题的错误:groups.google.com/forum/?fromgroups=#!topic/beautifulsoup/…
-
@BrenBarn 最后一篇文章确实表明我想做的事情是不可能的。随意发布该链接作为答案,以便我可以选择它。
-
这不是重复的。这个问题是关于如何查找/提取 CDATA 部分的。这一篇是关于如何在输出 XML 时保存它们。第一个是可能的,后者是不可能的。
标签: python xml beautifulsoup lxml cdata