lxml 解析中的命名空间参数
Namespace argument in lxml parsing
我有一个要解析的 html 页面。这是我对 lxml 的处理:
node=etree.fromstring(html)
>>> node
<Element {http://www.w3.org/1999/xhtml}html at 0x110676a70>
>>> node.xpath('//body')
[]
>>> node.xpath('body')
[]
不幸的是,我所有的 xpath 调用现在都返回一个空列表。为什么会发生这种情况,我该如何解决这个问题?
这里可以添加命名空间,如下:
>>> 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>]
查询时需要使用命名空间前缀。喜欢
node.xpath('//html:body', namespaces={'html': 'http://...'})
或者您可以使用 .nsmap
node.xpath('//html:body', namespaces=node.nsmap)
这假设所有命名空间都在 node
指向的标记上定义。这通常适用于大多数 xml
文档。
我有一个要解析的 html 页面。这是我对 lxml 的处理:
node=etree.fromstring(html)
>>> node
<Element {http://www.w3.org/1999/xhtml}html at 0x110676a70>
>>> node.xpath('//body')
[]
>>> node.xpath('body')
[]
不幸的是,我所有的 xpath 调用现在都返回一个空列表。为什么会发生这种情况,我该如何解决这个问题?
这里可以添加命名空间,如下:
>>> 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>]
查询时需要使用命名空间前缀。喜欢
node.xpath('//html:body', namespaces={'html': 'http://...'})
或者您可以使用 .nsmap
node.xpath('//html:body', namespaces=node.nsmap)
这假设所有命名空间都在 node
指向的标记上定义。这通常适用于大多数 xml
文档。