我有一个XML,其结构与我从API获得的结构 -
<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]
我也希望得到tes:type
source_type = sourceobject.xpath('//tes:actions/tes:type/text()')[0]
不起作用。它给出了以下错误 -
lxml.etree.XPathEvalError:未定义的名称空间前缀
如何让它忽略命名空间?
或者,我知道名称空间就是这个 -
<tes:action xmlns:tes="http://www.blah.com/client/servlet">
答案 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']
答案 1 :(得分:1)
访问命名空间中节点的正确方法是将prefix-namespace 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]