我如何告诉 lxml 使用哪个字符集?

How do I tell lxml which charset to use?

我正在使用 html 并使用 lxml 来解析它。出于测试目的,我有一个 html 文档作为字符串保存在 python 文件中,顶部带有 encoding=utf-8。

每当我尝试使用 lxml 解析 html 时,如果 html 没有 <meta charset="utf-8"> 标签,我会得到奇怪的 html 编码。

这是代码:

t = lxml.html.fromstring(page_html)
print lxml.html.tostring(t)

如果 page_html 字符串包含 tostring() 方法上方的元字符集 returns 很好地编码 html (即 变成 &#8217;).如果没有,结果就是乱码(即变成&#226;&#128;&#153;

这种编码发生在 fromstring 方法中,而不是 tostring 方法中,所以我不能在创建树之后就在树中插入一个新的元元素,因为那时它是晚了。

我能想到的唯一解决方案是尝试修改原始 html 字符串并在创建树之前在其中添加元标记。这看起来有点笨拙。使用 lxml 没有更好的方法吗?

原来我只需要将自定义解析器传递给 fromstring 方法。所以这修复了它:

parser = html.HTMLParser(encoding="utf-8")
t = lxml.html.fromstring(page_html, parser=parser)
print lxml.html.tostring(t)