2017-09-07 20 views
0

iterfindを使用して、すべてのIPv6 アドレス要素を解析しようとしています。私はマッチストリングが正しいと思ったが、結果は見ない。私は深いXMLファイルを解析することに慣れていないので、私はこの方法が最善のアプローチであることを疑問に思い始めていますか?ElementTreeのiterfindを使って深い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) 

答えて

2

xpath式が正しいことを確認してください。で開始:あなたは、XPath式、.//productsの冒頭を検索する場合

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

、あなたは何を得るのですか?

>>> 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>] 

これははるかに良いようです。

あなたのサンプルコードでその式を使用すると、妥当と思われる出力が生成されます。

関連する問題