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德莱尼:是的,我看到了你的答案,并把我的拿走了:)