使用lxml解析文件后无法正确显示unicode字符串,只需简单的文件读取即可正常工作

时间:2012-02-14 21:33:12

标签: python lxml

我试图使用lxml模块来解析HTML文件,但我很难让它与一些UTF-8编码数据一起使用。我在Windows上使用Python 2.7。例如,考虑一个没有字节顺序标记的UTF-8编码文件,该文件只包含文本字符串Québec。如果我只是使用常规文件处理程序读取文件的内容并解码生成的字符串对象,我会得到一个长度为6的unicode字符串,当写回文件时看起来很好。但是如果我用lxml解析文件,我会看到一个长度为7的unicode字符串,当写回文件时看起来很奇怪。有人可以用lxml来解释发生了什么,以及如何获得原始的,漂亮的字符串?

例如:

import lxml.html as html
from lxml import etree

f = open("output.txt", "w")

text = open("input.txt").read().decode("utf-8")
f.write("String of type '%s' with length %d: %s\n" % (type(text), len(text), text.encode("utf-8")))

root = html.parse("input.txt")
text = root.xpath(".//p")[0].text.strip()
f.write("String of type '%s' with length %d: %s\n" % (type(text), len(text), text.encode("utf-8")))

output.txt

中生成输出
String of type '<type 'unicode'>' with length 6: Québec
String of type '<type 'unicode'>' with length 7: Québec

修改

这里的部分解决方法似乎是使用以下方法解析文件:

etree.parse("input.txt", etree.HTMLParser(encoding="utf-8"))

html.parse("input.txt", etree.HTMLParser(encoding="utf-8"))

但是,据我所知,基础etree库缺少一些方便的选择器类,所以一个允许我使用lxml.html而不使用etree.HTMLParser()的解决方案仍然有用。

1 个答案:

答案 0 :(得分:0)

函数lxml.html.parse 已经使用lxml.html.HTMLParser的实例,因此您不应该反对使用

html.parse("input.txt", html.HTMLParser(encoding="utf-8"))

处理utf-8数据