如何在Python中最佳地按广度优先遍历lxml etree
我正在努力理解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)