如何使用html5lib解析HTML,并使用XPath查询解析的HTML?

Dan*_*low 17 python xpath parsing lxml html5lib

我正在尝试使用html5lib将html页面解析为我可以使用xpath查询的内容.html5lib文档接近零,我花了太多时间试图解决这个问题.最终目标是拉出表的第二行:

<html>
    <table>
        <tr><td>Header</td></tr>
        <tr><td>Want This</td></tr>
    </table>
</html>
Run Code Online (Sandbox Code Playgroud)

所以试试吧:

>>> doc = html5lib.parse('<html><table><tr><td>Header</td></tr><tr><td>Want This</td> </tr></table></html>', treebuilder='lxml')
>>> doc
<lxml.etree._ElementTree object at 0x1a1c290>
Run Code Online (Sandbox Code Playgroud)

看起来不错,让我们看看我们还有什么:

>>> root = doc.getroot()
>>> print(lxml.etree.tostring(root))
<html:html xmlns:html="http://www.w3.org/1999/xhtml"><html:head/><html:body><html:table><html:tbody><html:tr><html:td>Header</html:td></html:tr><html:tr><html:td>Want This</html:td></html:tr></html:tbody></html:table></html:body></html:html>
Run Code Online (Sandbox Code Playgroud)

大笑?

认真.我打算使用一些xpath来获取我想要的数据,但这似乎不起作用.那我该怎么办?我愿意尝试不同的库和方法.

Rya*_*rom 21

缺少文档是避免图书馆IMO的一个很好的理由,无论它有多酷.你是否坚持使用html5lib?你看过lxml.html吗?

以下是使用lxml执行此操作的方法:

from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]
Run Code Online (Sandbox Code Playgroud)

结果:

['Header', 'Want This']
Run Code Online (Sandbox Code Playgroud)


sci*_*shi 17

您想要使用的是namespaceHTMLElements参数,由于某种原因,该参数默认为True.

doc = html5lib.parse('''<html>
    <table>
        <tr><td>Header</td></tr>
        <tr><td>Want This</td></tr>
    </table>
</html>
''', treebuilder='lxml', namespaceHTMLElements=False)

print lxml.html.tostring(doc)
Run Code Online (Sandbox Code Playgroud)

但是,使用lxml.html可能更容易.

  • 它默认为"True",因为HTML规范将这些元素定义在HTML命名空间中 - 现有的Python工具要求它们不是选项存在的原因. (2认同)