关于requests报错UnicodeEncodeError: ‘gbk‘ codec can‘t encode character的解决,保证和别人的不一样哦

昨天,本菜鸡想摘取( 的美名)一些资料,代码如下

import requests
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).text
print(req)

本以为会一帆风顺,结果出乎意料,竟然报了个错

UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position 18577: illegal multibyte sequence

说是编码格式 gbk 无法编码字符 ‘\xa0’(万恶的字符,哼(¬︿̫̿¬☆))
我想都没想,直接把请求改成了如下

req = requests.get(url=url, headers=headers).content.decode('utf-8')

于是,我再次的本以为,以为万能的 utf-8 能够解救我的代码于苦海,但它竟然还报同样的错!什么鬼!
在这里插入图片描述

后来经过百度,查看别人的解决方法

  • 有这样的
    在这里插入图片描述

  • 有这样的
    在这里插入图片描述

  • 还有这样的
    在这里插入图片描述

  • 而我的电脑就是那么的特殊,这些办法都不行
    默默插一句,第三种方法可以输出了,但是都是乱码,如下图所示(部分结果)
    在这里插入图片描述


最后,我想着,能不能把这些不能编码的字符给 干掉(替换掉) ,于是,怀着最后一丝希望,我做了如下的尝试

import requests
import re
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).content.decode('utf-8')
index = req.replace('\xa0;', '').replace('\xa9;', '').replace('\ufe0f;', '')
print(index)

结果还是报错,为什么呢?

我猜,可能是因为这个代码的逻辑是先编码,再替换,而在编码的时候就已经报错了,但又没有办法先替换,因为 replace 只能操作字符串,不能操作字节流。

正当我手足无措的时候,我突然看到了两个字母,伟大的字母,那就是—— re,我怎么把这个库给忘了啊,我兴冲冲地用 re 最终完成了我的目标
终极代码如下:

import requests
import re
url = 'https://blog.csdn.net/jkx521/article/details/100714226'
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
req = requests.get(url=url, headers=headers).content.decode('utf-8')
index = re.sub('\xa0;\xa9\ufe0f', '', req)
print(index)
终于成功了!!!

(部分结果如下)
在这里插入图片描述


留下一个小疑问,为什么 re 和 replace 都是要求操纵字符串,re 就可以替换字符,但 replace 就不行呢???欢迎各位大佬一起讨论这个问题。




以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值