用minidom从XML节点提取文本

2024-10-05 15:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我看了好几篇文章,但还没有找到解决问题的答案。在

示例XML=

<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>

所以我知道如果我把TextWithNodes提取为NodeList,我会做如下的事情

^{pr2}$

我只得到None。我读过你必须写a.childNodes.nodeValue,但是节点列表中没有子节点,因为看起来所有的Nodeid都是结束标记?{{cd7>}如果{cd6>}使用。在

当我得到a的节点类型时,它是类型1,TEXT_NODE=3。我不确定这是否有用。在

我想提取TEXT1TEXT2,等等


Tags: 答案idnode示例类型节点文章xml
3条回答

您应该为您的任务使用elementtreeapi而不是minidom(如其他答案所述),但是如果您需要使用minidom,这里有一个解决方案。在

您要查找的内容已作为^{} attribute添加到DOM级别3。Minidom只支持级别1。在

但是,您可以使用此函数非常接近地模拟textContent:

def textContent(node):
    if node.nodeType in (node.TEXT_NODE, node.CDATA_SECTION_NODE):
        return node.nodeValue
    else:
        return ''.join(textContent(n) for n in node.childNodes)

你可以这样使用:

^{pr2}$

注意我是如何得到父节点TextWithNodes的文本内容的。这是因为您的Node元素是这些文本节点的同级,而不是它们的父级。在

来自文档的lxml的解决方案:

from lxml import etree
from StringIO import StringIO

xml = etree.parse(StringIO('''<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/></TextWithNodes>'''))

xml.xpath("//text()")
Out[43]: ['\n', 'TEXT1', 'TEXT2 ', 'TEXT3']

还可以提取特定节点的文本:

^{pr2}$

这里的问题是XML中的文本不属于任何节点。在

使用^{}(类似于@diegonavro在他的答案中使用的lxml,除了etree是标准库的一部分,并且没有XPATH等),您可以尝试以下操作:

import xml.etree.ElementTree as etree

xml_string = """<TextWithNodes>
<Node id="0"/>TEXT1<Node id="19"/>TEXT2 <Node id="20"/>TEXT3<Node id="212"/>
</TextWithNodes>
"""

xml_etree = etree.fromstring(xml_string)

text = [element.tail for element in xml_etree]
# `text` will be ['TEXT1', 'TEXT2 ', 'TEXT3', '\n']

注意,这假设XML <Node id="0"/>TEXT1。。。是正确的。因为文本跟在结束标记之后,所以它成为标记的尾部文本。它不是元素nodeValue,这就是为什么在问题中的代码中得到Nones

如果您想解析像<Node id="0">TEXT1</Node>这样的XML,您必须将[element.tail for element in xml_etree]替换为[element.text for element in xml_etree]。在

相关问题 更多 >