使用ElementTree的iterfind进行深度XML解析

时间:2017-09-07 18:55:52

标签: python xml-parsing lxml elementtree

我正在尝试使用iterfind解析所有IPv6 地址元素。我认为我的匹配字符串是正确的,但我没有看到任何结果。我不熟悉解析深层XML文件,所以我开始质疑这种方法是最好的方法吗?

import requests 
import xml.etree.ElementTree as ET

r = requests.get('https://support.content.office.net/en-us/static/O365IPAddresses.xml')

root = ET.fromstring(r.text)

for node in root.iterfind(".//products/product/[@name='o365']/addresslist/[@type='IPv6']"):
    data = []
    for d in node.getchildren():
        if d.text:
            data.append(d.text)
    print ' '.join(data)

1 个答案:

答案 0 :(得分:2)

退后一步,确保您的xpath表达式正确无误。从:

开始
>>> r = requests.get('https://support.content.office.net/en-us/static/O365IPAddresses.xml')
>>> root = ET.fromstring(r.text)

如果您搜索xpath表达式的开头.//products,您会得到什么?

>>> root.findall('.//products/product')
[]

你得到一个空列表,这意味着你的表达式存在问题。那是因为树的根是products元素:

>>> root
<Element 'products' at 0x7f16be5a9450>

所以hiearchy的第一级将是product

>>> root.findall('product')
[<Element 'product' at 0x7f16be5a9490>, <Element 'product' at 0x7f16be0e4190>, ...]

如果您将其替换为完整表达式,我们会得到:

>>> root.findall("product/[@name='o365']/addresslist/[@type='IPv6']")
[<Element 'addresslist' at 0x7f16be5a94d0>]

这似乎好多了。

在示例代码中使用该表达式会产生看似合理的输出。