无法正确显示lxml解析文件后的unicode字符串,简单文件读取正常
我正在尝试使用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库缺少一些方便的类,比如选择器,所以如果能有一个解决方案,让我在不使用etree.HTMLParser()的情况下使用lxml.html,那就太好了。
1 个回答
0
这个函数 lxml.html.parse
已经使用了一个 lxml.html.HTMLParser 的实例,所以你其实不需要排斥使用
html.parse("input.txt", html.HTMLParser(encoding="utf-8"))
来处理 utf-8 数据。