python - 如何使用 python 从 xml 中有效地提取 <![CDATA[]> 内容?

标签 python xml python-2.7 pandas lxml

我有以下 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 的所有元素?

最佳答案

这里有几处错误。 (询问有关选择图书馆的问题违反了这里的规则,所以我忽略了这部分问题)。

  1. 您需要传入文件句柄,而不是文件名称

    即:y = BeautifulSoup(open(x))

  2. 您需要告诉 BeautifulSoup 它正在处理 XML。

    即:y = BeautifulSoup(open(x), 'xml')

  3. CDATA部分不创建元素。你不能在 DOM 中搜索它们,因为它们不存在于 DOM 中;它们只是语法糖。直接看document下的文字就行了, 不要尝试搜索名为 CDATA 的内容.

    再次声明,略有不同:<doc><![CDATA[foo]]</doc><doc>foo</doc>完全相同 . CDATA 有什么不同?部分是其中的所有内容都会自动转义,这意味着 <![CDATA[<hello>]]被解释为 &lt;hello&gt; .但是——您无法从已解析的对象树中判断您的文档是否包含 CDATA。带有文字的部分 <>或带有 &lt; 的原始文本部分和 &gt; .这是设计使然,并且适用于任何兼容的 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') ]

如果你想从一个文件中读取,替换docopen(filename, 'r') .

关于python - 如何使用 python 从 xml 中有效地提取 &lt;![CDATA[]> 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991312/

相关文章:

python - 如何在 EC2 实例中使用 boto3

python - 如何获取一个类的所有方法及其参数的列表

Python 版本 2.7 : XML ElementTree: How to iterate through certain elements of a child element in order to find a match

Python+OpenCV : cv2. 写入

python - python中类变量的继承

python - 在 python 中使用 resample ('W' ),sum() 进行基于自定义周期的重采样时出错

vala 库的 Python 绑定(bind)

php - 将 PHP 关联数组传入和传出 XML

c# - 如何使用 WebBrowser 控件显示 XML?

python-2.7 - 将图像坐标系的原点更改为左下角而不是默认的左上角