我使用请求来检索包含一些unicode字符的url,并希望对其进行一些处理,然后将其写出来。
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?
答案 0 :(得分:2)
您未指定是否使用python 2或3.根据您使用的版本,编码的处理方式会有很大差异。无论如何,以下建议或多或少是普遍的。
r.text和r.content之间的区别在于Requests docs。简单地说,Requests将尝试为您找出字符编码并在解码后返回Unicode。这可以通过r.text访问。要获得字节,请使用r.content。
你真的需要掌握编码。阅读http://www.joelonsoftware.com/articles/Unicode.html并观看https://www.youtube.com/watch?v=sgHbC6udIqc即可开始使用。另外,搜索"克服沮丧:在python2中正确使用unicode"寻求更多帮助。
只是为了澄清,它并不像使用一种编码而是另一种编码一样简单。通过以字节为单位执行任何I / O并在应用程序中使用Unicode来创建Unicode三明治。如果你从字节开始(isinstance(mytext,str))你需要知道要解码为Unicode的编码,如果你从Unicode开始(isinstance(mytext,unicode))你应该编码为UTF-8,因为它将处理所有的世界人物。
确保你的编辑器,文件,服务器和数据库都配置为UTF-8,否则你会得到更多的“胡言乱语”。
如果您希望获得有关发布源文件和脚本输出的进一步帮助。