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

2024-05-23 22:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

<html>
    <table>
        <tr><td>Header</td></tr>
        <tr><td>Want This</td></tr>
    </table>
</html>

所以让我们试试:

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

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

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

哈哈,哇?

说真的。我本来打算使用一些xpath来获取我想要的数据,但这似乎行不通。那我该怎么办?我愿意尝试不同的图书馆和方法。


Tags: dochtmltablebodyrootthislxmlxpath
3条回答

您要使用的是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)

不过,使用lxml.html可能更容易。

缺少文档是避免使用IMO库的一个很好的理由,不管它有多酷。你对使用html5lib很着迷吗?你看过lxml.html了吗?

下面是一种使用lxml的方法:

from lxml import html
tree = html.fromstring(text)
[td.text for td in tree.xpath("//td")]

结果:

['Header', 'Want This']

我总是建议尝试lxml库。它速度惊人,有许多特点。

如果需要,它还支持html5lib解析器:html5parser

>>> from lxml.html import fromstring, tostring

>>> html = """
... <html>
...     <table>
...         <tr><td>Header</td></tr>
...         <tr><td>Want This</td></tr>
...     </table>
... </html>
... """
>>> doc = fromstring(html)
>>> tr = doc.cssselect('table tr')[1]
>>> print tostring(tr)
<tr><td>Want This</td></tr>

相关问题 更多 >