2012-02-29 50 views
0

我試圖在元素樹中找到一些節點,但這看起來工作方式不同,具體取決於我用於解析的實現。這似乎與文檔不一致。我錯過了什麼嗎?與元素樹和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。

回答

1

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