lxml解析中的命名空间参数

时间:2015-02-08 20:53:23

标签: python lxml

我有一个我试图解析的html页面。以下是我对lxml所做的事情:

node=etree.fromstring(html)
>>> node
<Element {http://www.w3.org/1999/xhtml}html at 0x110676a70>
>>> node.xpath('//body')
[]
>>> node.xpath('body')
[]

不幸的是,我所有的xpath调用现在都返回一个空列表。为什么会发生这种情况?我将如何解决此问题?

2 个答案:

答案 0 :(得分:1)

您可以在此处添加命名空间,如下所示:

>>> node.xpath('//xmlns:tr', namespaces={'xmlns':'http://www.w3.org/1999/xhtml'})
[<Element {http://www.w3.org/1999/xhtml}tr at 0x11067b6c8>, <Element {http://www.w3.org/1999/xhtml}tr at 0x11067b710>]

更好的方法是使用lxml's html解析器:

>>> node=lxml.html.fromstring(html)
>>> node.findall('body')
[<Element body at 0x1106b8f18>]

答案 1 :(得分:1)

查询时需要使用命名空间前缀。喜欢

node.xpath('//html:body', namespaces={'html': 'http://...'})

或者您可以使用.nsmap

node.xpath('//html:body', namespaces=node.nsmap)

这假设所有命名空间都在node指向的标记上定义。对于大多数xml文档,这通常是正确的。