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

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

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。
  • 大功告成

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/794568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存