出现的问题:UnicodeEncodeError: 'gbk' codec can't encode character '\u1160' in position 9000: illegal multibyte sequence
案例分析
当我们要爬取小红书的内容时,输入url的请求后,会出现编解码器无法对其进行编码。
import requests
r = requests.get('https://www.xiaohongshu.com')
resp = r.text
print(resp)
执行上述代码PyCharm会出现下述问题:

解决方案一
错误让人很头疼,当我在博客上看了很多的文章,最常见的解决办法是如下:
任意打开小红书任意网页,按F12进入浏览器的开发者模式,按下图依次点击

Content-Type: application/json; charset=utf-8
从上图可以得到网页的编码格式的确就是 UTF-8格式,但为什么依然会出现问题呢?
我的源文件部分代码是:
# 写入CSV文件表头
if not os.path.isfile(output_file):
with open(output_file, "w",newline="") as file:
writer = csv.DictWriter(file, fieldnames=csv_head)
writer.writeheader()
目标网站的编码是utf-8,问题的原因在于Python 3里面字符串的默认编码是Unicode的爬取的网页内容,是储存在字符串变量里。而使用代码创建TXT时,Windows下面新建的文本文件默认的编码是gbk(Windows简体中文版的系统默认编码就是gbk)当把从网页上读取的内容写到文本文件里去的时候,意味着把一个unicode的字符序列写入到一个编码是gbk的文件故报错。
解决方法就是在打开该文件的时候,指定文件的编码。
我根据大部分博主所说的解决方案,使用下方代码进行输出,以为可以一步到位,不过事与愿违。
# 写入CSV文件表头
if not os.path.isfile(output_file):
with open(output_file, "w",encoding='utf-8',newline="") as file:
writer = csv.DictWriter(file, fieldnames=csv_head)
writer.writeheader()
在open函数参数中设置encoding='utf-8'也不能解决问题,因此我们需要继续尝试。
解决方案二
至此我们需要研究一下在python3里编解码方式。
1、字符就是unicode字符,字符串就是unicode字符数组,如果用以下代码测试。
print('b'=='\u0062')
会发现结果为True,足以说明两者的等价关系。
2. str转bytes叫encode,bytes转str叫decode,如上面的代码就是将抓到的字节流给decode成unicode数组
根据上面的错误信息分析了字节流中出现\xe7的特殊字符,怀疑是它无法被解码,用以下代码测试后。
print(b'\xe7'.decode('utf-8'))

其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了。
import requests
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
r = requests.get('https://www.xiaohongshu.com')
resp = r.text
print(resp)
运行后不报错了,但是居然有好多乱码(英文显示正常,中文则显示乱码)!!又一阵折腾后发现是控制台的问题,具体来说就是我在cmd下运行该脚本会有乱码,而在IDLE下运行却很正常。
由此我推测是cmd不能很好地兼容utf8,而IDLE就可以,甚至在IDLE下运行,连“改变标准输出的默认编码”都不用,因为它默认就是utf8。如果一定要在cmd下运行,那就改一下编码,比如我换成“gb18030”,依然有乱码,添加了一行代码, 修改了响应的编码格式, r.encoding = 'utf-8', 问题解决。
import requests
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
r = requests.get('https://www.baidu.com')
r.encoding = 'utf-8'#添加的代码
resp = r.text
print(resp)
解决方案三:
我看了下代码,是没毛病的,而且网页的编码就是utf-8,编码没问题,那么只能是Pycharm中的编码设置的问题了。
我们在PyCharm设置里边指定编码为utf-8,就可以解决问题了,如下图所示。
打开设置以后:
我们将两个编码格式均设置为utf-8编码,成功解决!!!
参考:
python3 UnicodeEncodeError: 'gbk' codec can't enco - 知乎 (zhihu.com)
真正解决Windows下UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0错误的方法-CSDN博客

7068

被折叠的 条评论
为什么被折叠?



