2012-02-29 8 views
0

要素ツリー内にいくつかのノードを見つけようとしていますが、これは構文解析にどの実装を使用するかによって動作が異なるようです。それはドキュメントと一致していないようです。何か不足していますか?私もElementTreeのでhtml5lib試してみたが、それも文書に準拠しています解析を実行していないようだ要素ツリーとxpathとの相違

In [59]: type(html5lib.parse('<html><x /></html>', treebuilder='lxml').find('.//x')) 
Out[59]: <type 'NoneType'> 

In [72]: parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder('etree', cElementTree)) 

In [73]: type(parser.parse('<html><x /></html>')) 
Out[73]: <type 'NoneType'> 

それでは、どのよう

In [52]: ElementTree.fromstring('<html><x /></html>').find('.//x') 
Out[52]: <Element 'x' at 0x3008c10> 

が、私はこれを解決するのですか? 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>] 

それはプレーンなHTMLにhtml5lib assignesのXHTML名前空間ということが、かなり奇妙です。

+0

あなたのコメントは私に解決策をもたらしました: 'html5lib.parse(...、namespaceHTMLElements = False).xpath( '.// x')'はうまく動作します:) – viraptor

関連する問題