与元素树和xpath的区别
问题描述:
我试图在元素树中找到一些节点,但这看起来工作方式不同,具体取决于我用于解析的实现。这似乎与文档不一致。我错过了什么吗?与元素树和xpath的区别
In [52]: ElementTree.fromstring('<html><x /></html>').find('.//x')
Out[52]: <Element 'x' at 0x3008c10>
但:
In [59]: type(html5lib.parse('<html><x /></html>', treebuilder='lxml').find('.//x'))
Out[59]: <type 'NoneType'>
我试过也与ElementTree的html5lib,但这并不甚至似乎运行分析会遵守文档:
In [72]: parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder('etree', cElementTree))
In [73]: type(parser.parse('<html><x /></html>'))
Out[73]: <type 'NoneType'>
那么如何我解决这个问题吗?我无法直接继续使用ElementTree,因为它不会解析某些损坏的HTML。
答
xpath()
似乎工作:
>>> doc = html5lib.parse('<!doctype html><html><x /></html>', treebuilder='lxml')
>>> doc.xpath('.//*')
[<Element {http://www.w3.org/1999/xhtml}head at 0x102c04a50>,
<Element {http://www.w3.org/1999/xhtml}body at 0x102c04aa0>,
<Element {http://www.w3.org/1999/xhtml}x at 0x102c04af0>]
>>> doc.xpath('.//html:x', namespaces={'html':'http://www.w3.org/1999/xhtml'})
[<Element {http://www.w3.org/1999/xhtml}x at 0x102c04af0>]
这是相当奇怪,但是,html5lib
assignes XHTML命名空间纯HTML。
你的评论让我想到了解决方案:'html5lib.parse(...,namespaceHTMLElements = False).xpath('.// x')'工作得很好:) – viraptor 2012-02-29 02:58:01