2015-01-19 4 views
0

У меня есть XML со следующей структурой, что я получаю от API -XML для сканирования значения

<entry> 
    <id>2397</id> 
    <title>action_alert</title> 
    <tes:actions> 
     <tes:name>action_alert</tes:name> 
     <tes:type>2</tes:type> 
    </tes:actions> 
</entry> 

Я сканируемого для ID, выполнив следующие действия -

sourceobject = etree.parse(urllib2.urlopen(fullsourceurl)) 
source_id = sourceobject.xpath('//id/text()')[0] 

I также хочу получить текс: тип

source_type = sourceobject.xpath('//tes:actions/tes:type/text()')[0] 

Не работает. Это дает следующее сообщение об ошибке -

lxml.etree.XPathEvalError: Undefined префикс пространства имен

Как заставить его игнорировать пространство имен?

С другой стороны, я знаю, что пространство имен, которое это -

<tes:action xmlns:tes="http://www.blah.com/client/servlet"> 

ответ

1

Правильный способ доступа к узлам в пространстве имен является передача префикса пространства имен отображение URL в качестве дополнительного аргумента xpath() метода, например:

ns = {'tes' : 'http://www.blah.com/client/servlet'} 
source_type = sourceobject.xpath('//tes:actions/tes:type/text()', namespaces=ns) 

Или, еще один способ, который менее рекомендуется, буквально игнорируя пространств имен с использованием функции XPATH local-name():

source_type = sourceobject.xpath('//*[local-name()="actions"]/*[local-name()="type"]/text()')[0] 
1

Я не совсем уверен в пространстве имен вещи, но я думаю, что было бы проще использовать beautifulsoup: (text текст)

from bs4 import BeautifulSoup 

soup = BeautifulSoup(text) 

ids = [] 
get_ids = soup.find_all("id") 
for tag in get_ids: 
    ids.append(tag.text) 

#ids is now ['2397'] 

types = [] 
get_types = soup.find_all("tes:actions") 
for child in get_types: 
    type = child.find_all("tes:type") 
    for tag in type: 
     types.append(tag.text) 

#types is now ['2'] 
Смежные вопросы