XML扫描的价值

时间:2015-01-19 20:07:51

标签: python xml lxml

我有一个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">

2 个答案:

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