为什么 cssselect 不能与 html5parser 一起使用?

Why doesn't cssselect work with html5parser?

我试图在 lxml 解析的某些 HTML 页面上使用 cssselect,但我发现只有一个解析器给出了预期的结果:

这很好用:

lxml.html.fromstring("...").cssselect("div.foo")

这个returns没有结果:

lxml.html.html5parser.fromstring("...").cssselect("div.foo")

有什么区别?我可以让 cssselect 与 html5parser 一起使用吗?

原因请看这两个答案:

简而言之,原因是来自 html5lib 的解析将命名空间 html 添加到元素树,而其他解析器没有。

我认为这应该是一个错误,从 lxml 方面来说,也许......要解决这个问题:

import lxml.html.html5parser
from html5lib import HTMLParser
from html5lib.treebuilders.etree_lxml import TreeBuilder

parser = HTMLParser(tree=TreeBuilder, namespaceHTMLElements=False)
print(lxml.html.html5parser.fromstring("<div class=\"foo\"></div>", parser=parser))