使用lxml获取子元素属性

时间:2016-03-06 21:03:00

标签: python lxml

我使用host循环遍历一长串lxml etree元素,如下所示:

for host in xml.iter('host'):                                           

每个元素都是这样的:

<host status="up" />
   <address addr="84.20.200.143" addrtype="ipv4" />
</host>

我一直在阅读官方文档,试图找出如何获得每个子元素addr的{​​{1}},但经过十几次尝试,我无法包装我的绕过它。我该怎么做?

3 个答案:

答案 0 :(得分:2)

XPATH选择器可以为您提供所需的内容。假设我想要一个已启动主机的地址列表。我能做到:

for addr in xml.xpath('//host[@status="up"]/address/@addr'):
    print(addr)

如果我想要我做的所有地址:

for addr in xml.xpath('//host/address/@addr'):
    print(addr)

答案 1 :(得分:1)

当您遍历xml时,需要在要分析的标记上使用attrib.get('addr')

以下是您尝试执行的操作的功能示例:

s = """<host status="up">
   <address addr="84.20.200.143" addrtype="ipv4" />
</host>"""

import xml.etree.ElementTree as ET
tree = ET.ElementTree(ET.fromstring(s))
root = tree.getroot()
print(root)

for i in root:
    print(i.attrib.get('addr'))

产出:84.20.200.143

我相信您也可以在您所在的根节点上使用find来查找该根目录中的标记。但在幕后,这很可能也在迭代寻找标签。尽管如此:

d = root.find('address').attrib.get('addr')

额外信息。看看这个,这应该提供更多信息。来自文档:

https://docs.python.org/3/library/xml.etree.elementtree.html#finding-interesting-elements

答案 2 :(得分:1)

试试这个:

for host in xml.iter('host'):
    for child in host:
        print child.attrib['addr']

它遍历host的子元素address,然后打印addr attrib