为什么CSSSelect无法与html5parser一起使用?

时间:2019-07-28 02:23:50

标签: python lxml

我正在尝试在cssselect所解析的某些HTML页面上使用lxml,但是我发现只有一个解析器可以提供预期的结果:

这很好用:

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

这不会返回任何结果:

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

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

1 个答案:

答案 0 :(得分:1)

请查看有关原因的以下两个答案:

How to remove namespace value from inside lxml.html.html5paser element tag

lxml html5parser ignores "namespaceHTMLElements=False" option

简而言之,原因是来自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))