我有以下 xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><author id="user23">
<document><![CDATA["@username: That boner came at the wrong time ???? http://t.co/5X34233gDyCaCjR" HELP I'M DYING ]]></document>
<document><![CDATA[Ugh ]]></document>
<document><![CDATA[YES !!!! WE GO FOR IT. http://t.co/fiI23324E83b0Rt ]]></document>
<document><![CDATA[@username Shout out to me???? ]]></document>
</author>
解析和提取 <![CDATA[
的最有效方法是什么?内容 ]]>
成一个列表。比方说:
[@username: That boner came at the wrong time ???? http://t.co/5X34233gDyCaCjR" HELP I'M DYING Ugh YES !!!! WE GO FOR IT. http://t.co/fiI23324E83b0Rt @username Shout out to me???? ]
这是我尝试过的:
from bs4 import BeautifulSoup
x='/Users/user/PycharmProjects/TratandoDeMejorarPAN/test.xml'
y = BeautifulSoup(open(x), 'xml')
out = [y.author.document]
print out
这是输出:
[<document>"@username: That boner came at the wrong time ???? http://t.co/5XgDyCaCjR" HELP I'M DYING </document>]
这个输出的问题是我不应该得到 <document></document>
.我怎样才能删除 <document></document>
标记并在列表中获取此 xml 的所有元素?
最佳答案
这里有几处错误。 (询问有关选择图书馆的问题违反了这里的规则,所以我忽略了这部分问题)。
您需要传入文件句柄,而不是文件名称。
即:
y = BeautifulSoup(open(x))
您需要告诉 BeautifulSoup 它正在处理 XML。
即:
y = BeautifulSoup(open(x), 'xml')
CDATA
部分不创建元素。你不能在 DOM 中搜索它们,因为它们不存在于 DOM 中;它们只是语法糖。直接看document
下的文字就行了, 不要尝试搜索名为CDATA
的内容.再次声明,略有不同:
<doc><![CDATA[foo]]</doc>
与<doc>foo</doc>
完全相同 .CDATA
有什么不同?部分是其中的所有内容都会自动转义,这意味着<![CDATA[<hello>]]
被解释为<hello>
.但是——您无法从已解析的对象树中判断您的文档是否包含CDATA
。带有文字的部分<
和>
或带有<
的原始文本部分和>
.这是设计使然,并且适用于任何兼容的 XML DOM 实现。
现在,一些实际有效的代码怎么样:
import bs4
doc="""
<?xml version="1.0" encoding="UTF-8" standalone="no"?><author id="user23">
<document><![CDATA["@username: That came at the wrong time ????" HELP I'M DYING ]]></document>
<document><![CDATA[Ugh ]]></document>
<document><![CDATA[YES !!!! WE GO FOR IT. ]]></document>
<document><![CDATA[@username Shout out to me???? ]]></document>
</author>
"""
doc_el = bs4.BeautifulSoup(doc, 'xml')
print [ el.text for el in doc_el.findAll('document') ]
如果你想从一个文件中读取,替换doc
与 open(filename, 'r')
.
关于python - 如何使用 python 从 xml 中有效地提取 <![CDATA[]> 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991312/