Python 如何迭代ElementTree中的子文本节点(而不是子体)?

Python 如何迭代ElementTree中的子文本节点(而不是子体)?,python,elementtree,Python,Elementtree,给定这样的元素 <A> hello <annotation> NOT part of text </annotation> world </A> 你好 不是正文的一部分 世界 如何使用ElementTree,仅获取子文本节点(如XPathtext()) iter()和itertext()都是树漫游器,其中包括所有子节点。我知道没有直接的子迭代器。另外,iter()只查找元素(毕竟是ElementTree),因此不能

给定这样的元素

<A>
    hello

    <annotation> NOT part of text </annotation>

    world
</A>

你好
不是正文的一部分
世界
如何使用
ElementTree
,仅获取子文本节点(如XPath
text()

iter()
itertext()
都是树漫游器,其中包括所有子节点。我知道没有直接的子迭代器。另外,
iter()
只查找元素(毕竟是ElementTree),因此不能用于收集文本节点本身


我知道有一个名为
lxml
的库,它提供了更好的XPath支持,但在添加另一个依赖项之前,我在这里询问。(另外,我对Python非常陌生,因此可能遗漏了一些明显的东西。)

您发现示例的文本在三个属性中有点反直觉:

  • “你好”的文本
  • annotation.text表示“不是文本的一部分”
  • “世界”的annotation.tail
(省略空格)。这有点麻烦。但是,以下几点应该会有所帮助:

 import xml.etree.ElementTree as et

 xml = """
 <A>
     hello

     <annotation> NOT part of text </annotation>

     world
 </A>"""


 doc = et.fromstring(xml)


 def all_texts(root):
     if root.text is not None:
         yield root.text
     for child in root:
         if child.tail is not None:
             yield child.tail


 print list(all_texts(doc))
将xml.etree.ElementTree作为et导入
xml=”“”
你好
不是正文的一部分
世界
"""
doc=et.fromstring(xml)
定义所有_文本(根):
如果root.text不是无:
产生root.text
对于根目录中的子目录:
如果child.tail不是None:
让出尾巴
打印列表(所有文档)

谢谢!这很好用。我觉得奇怪的
tail
属性可以在这里使用。