与元素树和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。

+0

你的评论让我想到了解决方案:'html5lib.parse(...,namespaceHTMLElements = False).xpath('.// x')'工作得很好:) – viraptor 2012-02-29 02:58:01