lxml.html解析和utf-8与requests
我用requests库去获取一个网址,这个网址里有一些unicode字符,然后我想对这些字符进行处理,最后再把结果写出来。
r=requests.get(url)
f=open('unicode_test_1.html','w');f.write(r.content);f.close()
html = lxml.html.fromstring(r.content)
htmlOut = lxml.html.tostring(html)
f=open('unicode_test_2.html','w');f.write(htmlOut);f.close()
在unicode_test_1.html文件里,所有的字符看起来都正常,但在unicode_test_2.html文件里,有些字符变成了乱码,这是为什么呢?
我接着尝试了
html = lxml.html.fromstring(r.text)
htmlOut = lxml.html.tostring(html,encoding='latin1')
f=open('unicode_test_2.html','w');f.write(htmlOut);f.close()
现在似乎可以正常工作了。但我还是不明白为什么会这样,为什么总是要用latin1编码?
r.text和r.content有什么区别?为什么我不能用encoding='utf-8'
来写出html呢?
1 个回答
你没有说明你使用的是 Python 2 还是 3。根据你使用的版本,编码的处理方式会有很大不同。不过,以下的建议大致上是适用的。
r.text 和 r.content 之间的区别在于 Requests 文档中有说明。简单来说,Requests 会尝试为你判断字符编码,并在解码后返回 Unicode,这个可以通过 r.text 访问。如果你只想要字节数据,可以使用 r.content。
你真的需要好好了解编码的概念。可以阅读 http://www.joelonsoftware.com/articles/Unicode.html,并观看 https://www.youtube.com/watch?v=sgHbC6udIqc 来入门。此外,可以搜索“克服挫折:在 Python2 中正确使用 Unicode”来获得更多帮助。
需要说明的是,使用一种编码并不总是比另一种简单。你可以把它想象成做一个 Unicode 三明治:在进行输入输出时使用字节,在你的应用程序中使用 Unicode。如果你从字节开始(isinstance(mytext, str)),你需要知道编码才能解码成 Unicode;如果你从 Unicode 开始(isinstance(mytext, unicode)),你应该编码为 UTF-8,因为它可以处理世界上所有的字符。
确保你的编辑器、文件、服务器和数据库都配置为 UTF-8,否则你会看到更多的“乱码”。
如果你需要进一步的帮助,可以发布你的源文件和脚本的输出。