Python 使用lxml获取子元素属性

Python 使用lxml获取子元素属性,python,lxml,Python,Lxml,我正在使用lxml-etree循环浏览一长串host元素,如下所示: for host in xml.iter('host'): <host status="up" /> <address addr="84.20.200.143" addrtype="ipv4" /> </host> 每个元素如下所示: for host in xml.iter('host'):

我正在使用
lxml-etree
循环浏览一长串
host
元素,如下所示:

for host in xml.iter('host'):                                           
<host status="up" />
   <address addr="84.20.200.143" addrtype="ipv4" />
</host>
每个元素如下所示:

for host in xml.iter('host'):                                           
<host status="up" />
   <address addr="84.20.200.143" addrtype="ipv4" />
</host>


我一直在阅读官方文件,试图找出如何获得每个子元素的
地址
addr
,但经过十几次尝试后,我还是无法理解。我该怎么做呢?

当您遍历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'))
额外信息。看看这个,这应该提供更多的信息。从文档中:


在遍历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'))
额外信息。看看这个,这应该提供更多的信息。从文档中:

试试这个:

for host in xml.iter('host'):
    for child in host:
        print child.attrib['addr']
它遍历
host
的子元素,即
address
,然后打印
addr
attrib

尝试以下操作:

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

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

,XPATH选择器可能会得到您想要的。假设我想要一个启动主机的地址列表。我可以做到:

for addr in xml.xpath('//host[@status="up"]/address/@addr'):
    print(addr)
如果我想要所有地址,我可以:

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

XPATH选择器可以满足您的需要。假设我想要一个启动主机的地址列表。我可以做到:

for addr in xml.xpath('//host[@status="up"]/address/@addr'):
    print(addr)
如果我想要所有地址,我可以:

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

因此,即使我知道主机中只有一个
地址
标记,我也不能直接访问它?我必须循环子元素?实际上,我的文件中有许多
主机
,每个主机都有多个子元素(在本例中,我只显示了一个子元素)。因此,即使我知道
主机
中只有一个
地址
标记,我也无法直接访问它?我必须循环子元素?实际上,在我的文件中有许多
主机
,每个主机都有多个子元素(在本例中,我只显示了一个子元素)。我们不能按名称访问
地址
?在我的实际情况中,有不止一个子元素,我是否必须遍历每个子元素并检查
name==“address”
?将host.iter('address')
@warmoverflow中的子元素的第二个循环更改为
,其效果不比lxml好。我看不出另一匹马有什么更好的地方。@t德莱尼:是的,我看到了你的答案,并删除了我的:)我们不能通过名字访问地址吗?在我的实际情况中,有不止一个子元素,我是否必须遍历每个子元素并检查
name==“address”
?将host.iter('address')
@warmoverflow中的子元素的第二个循环更改为
,其效果不比lxml好。我看不出一匹不同的马有什么更好的地方。@t德莱尼:是的,我看到了你的答案,并把我的拿走了:)