如何在Python中最佳地按广度优先遍历lxml etree

3 投票
2 回答
3427 浏览
提问于 2025-04-17 19:11

我正在努力理解lxml(我还是新手),想知道怎么用它来实现我想做的事情。我有一个格式正确且有效的XML文件。

<root>
  <a>
    <b>Text</b>
    <c>More text</c>
  </a>
  <!-- some comment -->
  <a>
    <d id="10" />
  </a>
</root>

大概是这样的。现在我想要以广度优先的方式访问它的子元素,我想到的办法是这样的:

for e in xml.getroot()[0].itersiblings() :
    print(e.tag, e.attrib)

然后再从那里继续。不过,这样做会让我得到所有元素,包括注释。

a {}
<built-in function Comment> {}
a {}

我该怎么跳过注释呢?有没有更好的方法来遍历一个节点的直接子元素?

一般来说,解析XML树和使用像iterparse()这样的事件驱动拉取解析,有什么推荐的做法吗?

2 个回答

1

这个问题是9年前提出来的,但我最近也遇到了这个问题,并且用以下方法解决了它。

import xml.etree.ElementTree as ET

xmlfile = ET.parse("file.xml")
root = xmlfile.getroot()

visit = [root]
while len(visit):
  curr = visit.pop(0)
  print(curr.tag, curr.attrib, curr.text)
  visit += list(curr)

list(node) 会给出这个节点的所有直接子节点的列表。所以我们可以把这些子节点放到一个栈里,然后不断重复这个过程,处理栈顶的节点(同时把它从栈里移除),这样就能实现标准的广度优先搜索了。

4

这适合你的情况

for child in doc.getroot().iterchildren("*"):
    print(child.tag, child.attrib)

撰写回答