用于Python(2.6)的ElementTree的标准实现不提供从子节点指向父节点的指针。因此,如果需要父母,建议对父母而不是孩子进行循环。
假设我的xml是这样的:
<Content>
<Para>first</Para>
<Table><Para>second</Para></Table>
<Para>third</Para>
</Content>
以下查找不考虑父节点的所有“Para”节点:
(1) paras = [p for p in page.getiterator("Para")]
这(改编自effbot)通过在父节点而不是子节点上循环来存储父节点:
(2) paras = [(c,p) for p in page.getiterator() for c in p]
这是完全有意义的,可以通过一个条件来扩展,以实现(假设)与(1)相同的结果,但是添加了父信息:
(3) paras = [(c,p) for p in page.getiterator() for c in p if c.tag == "Para"]
ElementTree documentation建议getiterator()方法执行深度优先搜索。运行它而不查找父(1)会产生:
first
second
third
然而,从第(3)段中提取文本,得到:
first, Content>Para
third, Content>Para
second, Table>Para
这似乎是广度第一。
因此,这提出了两个问题。
考虑一下:
旁白:列表理解是非常棒的,直到你想清楚什么是被迭代的:-)
getiterator
是按广告顺序生成“ppp”元素的。然而,您正在从附属“ccc”元素中提取感兴趣的元素,这些元素不符合您所需的顺序。一种解决方案是进行自己的迭代:
现在,您可以在每个“Para”元素经过时,都引用其父元素(如果有的话)。
这可以很好地包装在发电机小工具中:
相关问题 更多 >
编程相关推荐