2016-06-02 4 views
1

У меня есть этот вывод xml, я хочу извлечь несколько элементов.lxml doc.find return None

Пример 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 печатает None. Можете ли вы исправить меня, где я ошибаюсь?

+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 пространства имен (моя идея была «d» для «default») – 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 
Смежные вопросы