Python爬虫踩坑:UnicodeEncodeError: ‘gbk‘ codec can‘t encode character 全网最有效解的决方法

在这里插入图片描述

1. 问题描述

  • 我在网上看到了一本喜欢的小说,希望用爬虫把正本小说下载下来。
    在这里插入图片描述
    于是写下了这样一段代码:
from urllib import request

headers = {
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; ."
                  "NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)"}

url_menu = "https://www.biqu100.com/3_3075/"

req = request.Request(url=url_menu, headers=headers)
res = request.urlopen(req, timeout=5)
html = res.read().decode("utf-8")
print(html)

可是解释器报错:UnicodeEncodeError: ‘gbk’ codec can’t encode character …
在这里插入图片描述
在这里插入图片描述

2. 解决方法

  • 按照网上找到的很多方法进行了尝试,结果均无效,但是作为笔记,在此还是做一下记录。
  • 对于第一次遇到这个问题的同学,建议从第一步开始仔细排查一遍;
  • 对于在网上找了很久解决方案的同学,可以直接跳到文章最后,查看最终办法

2.1 步骤1

  • 检查解码格式
  • 首先要确定从网上爬下来的这一段二进制流应该用什么格式来解码。如果这是一串gbk格式的字节流,但我们用utf-8来解码,肯定无法解析。
  • 在网页上点击鼠标右键,点击“检查”,在html中的head里找到“meta charset”,这一项就是正确的解码格式。
    在这里插入图片描述
  • 如果在解码时已经指定了正确的格式,如:
html = res.read().decode("utf-8")
  • 结果依旧报错,则参照步骤二。

2.2 步骤2

  • 忽略异常字符
  • 虽然解码格式已经确认了,但是由于获取到的二进制流中,可能存在错误信息,或其中夹杂的部分字符根本就不是文字信息,各种各样的原因都有可能导致我们解码错误。
  • 关于这个问题,网上有很多解决方法。在这里我记录一个最简单的。
  • 我们在解码的时候,调用的是StreamReader类的decode函数。
    在这里插入图片描述
  • 这个函数的error参数可以指定发生错误时,应该采取的处理方式。我们在这个参数里填上"ignore",那么,在解码过程中,遇到无法解析的字符时,就会自动跳过,从而完成整体解析。
  • 有些同学做到这一步的时候,问题应该就已经解决了,但是我踩坑踩得比较深,即使做到这一步了,问题还是没有解决。
    在这里插入图片描述

2.3 步骤3

  • PyCharm设置
  • 我注意到,我已经用utf-8来解码了,但是解释器的报错信息还是暴出gbk方面的解码错误。
  • 会对这串二进制流进行处理的只有三方,一方是Chrome浏览器,一方是Python解释器,另一方是PyCharm,事实证明Chrome浏览器用utf-8格式是可以解析的,那么格式肯定是对的,StreamReader类已经考虑到了异常字符的处理方式,所以Python本身也不会有问题,那么问题只有可能出在PyCharm的设置上了。
  • 点击File -> Settings…
    在这里插入图片描述
    找到Project Encoding项目,发现这一项果然写死了GBK格式,将其修改为UTF-8,然后点击OK。
    在这里插入图片描述
  • 大功告成
    在这里插入图片描述
    在这里插入图片描述
  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值