Python及requests乱码问题的总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nano_Y/article/details/50533955

今天在用requests抓取网页的时候,发现有个页面,

r = requests.get(url)

s = r.text
s一直都有乱码

以前每次碰到乱码问题,解决完了就过去了,今天想好好研究一下,免得以后再遇到又不知道怎么办了。下面是一些总结:

以下为找到的资料:

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码


如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断,用非unicode编码形式的str来encode会报错 

我看了一下待抓取的页面,charset是gb2312

所以按照以上的说法,我先判断了一下

isinstance(s, unicode)

显示为True
既然如此,那我是否可以
s.encode('gb2312')
结果直接报错

UnicodeEncodeError: 'gb2312' codec can't encode character u'\xbb' in position 317: illegal multibyte sequence

目前不知道是什么原因,猜想是本来是gb2312,转成unicode之后出现了gb2312不能解析的特殊字符?

既然如此,那我们就不要用unicode了

s = r.content
通过type(s)知道,s现在的类型是str,这样再通过

s.decode('gb2312')
解码,就没有乱码啦~

展开阅读全文

没有更多推荐了,返回首页