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