Python 获取XML节点的文本,包括子节点(或类似的内容)

Python 获取XML节点的文本,包括子节点(或类似的内容),python,xml,Python,Xml,我必须从xml节点及其子节点中获取纯文本,或者这些奇怪的内部标记是什么: 示例节点: <BookTitle> <Emphasis Type="Italic">Z</Emphasis> = 63 - 100 </BookTitle> 记住,这只是一个例子!BookTitle节点中可能有任何类型的“子节点”,我所需要的只是BookTitle中的纯文本 我试过: tagtext = root.find('.//BookTitle').text pri

我必须从xml节点及其子节点中获取纯文本,或者这些奇怪的内部标记是什么:

示例节点:

<BookTitle>
<Emphasis Type="Italic">Z</Emphasis>
 = 63 - 100
</BookTitle>
记住,这只是一个例子!BookTitle节点中可能有任何类型的“子节点”,我所需要的只是BookTitle中的纯文本

我试过:

tagtext = root.find('.//BookTitle').text
print tagtext
但是.text无法处理这种奇怪的xml节点,并返回“NoneType”


问候和感谢

这不是
书名
节点的
文本
,而是
强调
节点的
尾部
。所以你应该做一些类似的事情:

def parse(el):
    text = el.text.strip() + ' ' if el.text.strip() else ''
    for child in el.getchildren():
        text += '{0} {1}\n'.format(child.text.strip(), child.tail.strip())
    return text
这给了你:

>>> root = et.fromstring('''
    <BookTitle>
    <Emphasis Type="Italic">Z</Emphasis>
     = 63 - 100
    </BookTitle>''')
>>> print parse(root)
Z = 63 - 100
>>root=et.fromstring(“”)
Z
= 63 - 100
''')
>>>打印解析(根)
Z=63-100
以及:

>>> root = et.fromstring('''
<BookTitle>
Mtn
<Emphasis Type="Italic">Z</Emphasis>
 = 74 - 210
</BookTitle>''')
>>> print parse(root)
Mtn Z = 74 - 210
>>root=et.fromstring(“”)
Mtn
Z
= 74 - 210
''')
>>>打印解析(根)
Mtn Z=74-210
这应该给你一个基本的想法怎么做


更新:修复了空格…

您可以使用minidom解析器。以下是一个例子:

from xml.dom import minidom

def strip_tags(node):
    text = ""
    for child in node.childNodes:
        if child.nodeType == doc.TEXT_NODE:
            text += child.toxml()
        else:
            text += strip_tags(child)
    return text

doc = minidom.parse("<your-xml-file>")

text = strip_tags(doc)
从xml.dom导入minidom
def条带标签(节点):
text=“”
对于node.childNodes中的子节点:
如果child.nodeType==doc.TEXT\u节点:
text+=child.toxml()
其他:
文本+=条带标签(子项)
返回文本
doc=minidom.parse(“”)
文本=带标签(文件)

strip_tags递归函数将浏览xml树并按顺序提取文本。

谢谢,我在尾部为空或文本为空时出错,所以我这样做了:
def parse(el):text=''if el.text:text=el.text.strip()for child in el.getchildren():if child.text:text+=child.text.strip()if child.tail:text+=child.tail.strip()返回文本
,该文本似乎正在工作。如果我可以简化,请告诉我:)是的,你必须检查
尾部
文本
是否为
,我忘了包括该检查。我从你的例子中假设它们永远存在。
>>> root = et.fromstring('''
<BookTitle>
Mtn
<Emphasis Type="Italic">Z</Emphasis>
 = 74 - 210
</BookTitle>''')
>>> print parse(root)
Mtn Z = 74 - 210
from xml.dom import minidom

def strip_tags(node):
    text = ""
    for child in node.childNodes:
        if child.nodeType == doc.TEXT_NODE:
            text += child.toxml()
        else:
            text += strip_tags(child)
    return text

doc = minidom.parse("<your-xml-file>")

text = strip_tags(doc)