2016-06-02 4 views
1

私はこのxml出力を持っていますが、いくつかの要素を抽出したいと思います。lxml doc.find returnedなし

サンプルXMLは:

<?xml version="1.0" encoding="UTF-8"?> 
<rpc-reply xmlns="urn:ietf:2.0" message-id="101"> 
    <data> 
    <bl1 xmlns="http://example.com/ns/xyz/xxx-op"> 
     <A> 
     <B> 
      <C> 
      <D> 
       <E>0.0.0.0</E> 
       <F>1200</F> 
       <C> 
       <G>0</G> 
       <H>0</H> 
       <I>0</I> 
       <J>0</J> 
       <K>0</K> 
       <L>0</L> 
       <M>0</M> 
       <N>0</N> 
       <O>0</O> 
       <P>0</P> 
       <Q>0</Q> 
       <R>0</R> 
       <S>0</S> 
       <T>0</T> 
       <U>0</U> 
       <V>0</V> 
       <W>0</W> 
       <X>0</X> 
       </C> 
       <Y>1.1.1.1</Y> 
       <Z>IPv6</Z> 
      </D> 
      </C> 
     </B> 
     </A> 
    </bl1> 
    </data> 
</rpc-reply> 

は、私は、これが動作していない、

from lxml import etree 
doc = etree.parse("sample.xml") 
print doc 
memoryElem = doc.find('Y') 
print memoryElem 
print memoryElem.text  # element text 

どういうわけか、次のスニペット

コードを試してみました。 memoryElemは印刷していません。 私が間違っているところで私を修正できますか?

+0

あなたの編集は大丈夫だったが、あなたは重要なコードを削除したので、私はロールバック。 – zondo

答えて

2

あなたのターゲット要素は、既定の名前空間である:

xmlns="http://example.com/ns/xyz/xxx-op" 

あなたはデフォルトの名前空間URIに接頭辞をマップし、名前空間内の要素を参照するためにそのプレフィックスを使用する必要があります。

ns = {'d': 'http://example.com/ns/xyz/xxx-op'} 
memoryElem = doc.find('.//d:Y', ns) 
print memoryElem.text  
+0

名前空間接頭辞として 'd'を使う理由は何ですか?これは恣意的ですか? –

+1

@LutzHornはい、正しい名前空間URIにマップされている限り、それは恣意的です(私のアイデアは 'default'では 'd'でした) – har07

0

おそらく名前空間の問題です。

あなたがBeautifulSoup試みることができる:

import bs4 

soup = bs4.BeautifulSoup(open("sample.xml", "r").read(), features="xml") 
yt = soup.find("Y").text 
print(yt) 

出力:タイトルに

1.1.1.1