Отличия от дерева элементов и xpath - PullRequest
0 голосов
/ 29 февраля 2012

Я пытаюсь найти некоторые узлы в дереве элементов, но, похоже, это работает по-разному, в зависимости от того, какую реализацию я использую для анализа. Это не похоже на документацию. Я что-то упустил?

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'>

Я также пробовал html5lib с ElementTree, но, похоже, он даже не запускает синтаксический анализ, который бы соответствовал документации:

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 Ответ

1 голос
/ 29 февраля 2012

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 назначает пространство имен XHTML простому HTML.

...