[PyThon爬虫编码问题]- ‘gbk‘ codec can‘t encode character ‘\u1160‘ in position 9000解决办法

出现的问题: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博客

UnicodeEncodeError: ‘gbk‘ codec can‘t encode character 的解决方法_unicodeencodeerror: 'gbk' codec can't encode chara-CSDN博客

https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/groups/dadde766-b087-42da-8e67-d2499a520ee7/streams/a0119567-bf91-4314-ab75-f683ba6c0c0a/logs 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伪_装

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值