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
,仅获取子文本节点(如XPathtext()
)
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
属性可以在这里使用。