python - 遍历 lxml etree 中的文本和元素

标签 python lxml elementtree

假设我有以下 XML 文档:

<species>
    Mammals: <dog/> <cat/>
    Reptiles: <snake/> <turtle/>
    Birds: <seagull/> <owl/>
</species>

然后我得到这样的 species 元素:

import lxml.etree
doc = lxml.etree.fromstring(xml)
species = doc.xpath('/species')[0]

现在我想打印一份按物种分组的动物列表。我如何使用 ElementTree API 来做到这一点?

最佳答案

如果您枚举所有节点,您将看到一个带有类的文本节点,后跟带有物种的元素节点:

>>> for node in species.xpath("child::node()"):
...     print type(node), node
... 
<class 'lxml.etree._ElementStringResult'> 
    Mammals: 
<type 'lxml.etree._Element'> <Element dog at 0xe0b3c0>
<class 'lxml.etree._ElementStringResult'>  
<type 'lxml.etree._Element'> <Element cat at 0xe0b410>
<class 'lxml.etree._ElementStringResult'> 
    Reptiles: 
<type 'lxml.etree._Element'> <Element snake at 0xe0b460>
<class 'lxml.etree._ElementStringResult'>  
<type 'lxml.etree._Element'> <Element turtle at 0xe0b4b0>
<class 'lxml.etree._ElementStringResult'> 
    Birds: 
<type 'lxml.etree._Element'> <Element seagull at 0xe0b500>
<class 'lxml.etree._ElementStringResult'>  
<type 'lxml.etree._Element'> <Element owl at 0xe0b550>
<class 'lxml.etree._ElementStringResult'> 

所以你可以从那里构建它:

my_species = {}
current_class = None
for node in species.xpath("child::node()"):
    if isinstance(node, lxml.etree._ElementStringResult):
        text = node.strip(' \n\t:')
        if text:
            current_class = my_species.setdefault(text, [])
    elif isinstance(node, lxml.etree._Element):
        if current_class is not None:
            current_class.append(node.tag)
print my_species

结果

{'Mammals': ['dog', 'cat'], 'Reptiles': ['snake', 'turtle'], 'Birds': ['seagull', 'owl']}

这一切都很脆弱......文本节点排列方式的微小变化可能会扰乱解析。

关于python - 遍历 lxml etree 中的文本和元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071072/

相关文章:

python - 同时运行 Pythons Tornado 服务 ssl 和不安全的 sl

python - 无法在 OS X 10.8.5 上安装 lxml

python - 美丽汤/lxml : Are there problems with large elements?

python - 在 Python 中使用 ElementTree 从 XML 中提取数据

python - charm.pool.map 和 tq​​dm : obtain a progressbar

python - 为什么python会忽略带有dict.keys()的if语句?

python - Pig Python UDF 和 lxml

python - 当我运行 `for glyph in font.iter(' glyph')` 时,为什么 etree 没有从我的 SVG 中返回任何内容?

python - lxml etree.iterparse 错误 "TypeError: reading file objects must return plain strings"

python - 使用 python 更改键盘布局?