你非常幸运的看到这篇文章,因为作为新手,你狠困扰的爬虫抓取的编码问题得到解决!

本文系统环境:Windows 7 + Python 3.4

演示的代码如下

import urllib.request
url= 'https://www.mimvp.com'
content = urllib.request.urlopen(url).read()
content = content.decode(‘gbk’)
print(content)

 

因为我提前看了一下163网页的代码,是charset=gb2312

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312” />

所以我直接用的gbk解码,因为gbk包含gb2312

但是我一运行,就发现

看一下bug思路

1. 编码问题

编码换成 gb2312、gbk、utf-8、cp1800 等等,结果没有解决

 

2. 版本问题

有群友说python2.7 完美运行,又下载python2.7版本来test,果然正常

可以看到2.7在我删除request之后完美运行,那么我们的怀疑是正确的,可是为什么2.7 可以完美运行呢?

觉得很奇怪的一点是,这个脚本,一直是可以正常运行的,怎么突然就出现了语法错误了。

然后发现是带有中文的代码,会出现错误。

第一反应是,可能是安装了那个python的Python Imaging Library (PIL)库,然后影响了当前的python 2.7.2版本的语法了,影响成为类似于python 3.x的语法了。

因为之前试过,python 3.x版本中,对于上述写法,即u加上中文,比如:

u'这是中文',是不支持的。而python 2.x的语法是支持的,表示这个字符是unicode的字符,会自动处理编码,成为unicode变量的。

也就是说python在中文编码一块简直蛋痛,虽然知乎上经常就说3.x如何如何对中文支持很流畅,但是爬虫我一点没感觉到。

 

3. 其他问题

因为知乎推荐的问题,我不想把爬虫给我换回去了,就想办法在3.X的情况下解决这个编码问题,但是每次弹出0X8b无法被decode我都很想问候他们python新版本的家人。

最后在一个不起眼的角落看到了这个:

链接没找到,大概就是一句话:如果出现UnicodeDecodeError: ‘utf-8’ codec can’t decode 请删除header中gzip的语句。

总所周知,gzip在网页中用于压缩是传输速度更快,刚好python群里那个友人提到gzip有可能成为无法解码的问题所在。

然后在 http://www.yiibai.com/python/python3-webbug-series4.html

看到中间有用gzip解压函数,原来就是调用一下就可以。

好,让我们把gzip加上

import gzip
import urllib.request
url= 'http://www.163.com'
content = urllib.request.urlopen(url).read()
content = gzip.decompress(content)
content = content.decode('gbk')
print(content)

运行,发现成功了

 

 

原文转自python3.X编码错误:UnicodeDecodeError: ‘GB2312’ codec can’t decode

 

参考推荐

Python编码与解码

Python utf-8和utf8的区别

Python中Base64编码和解码

Python 中正确使用 Unicode

Python 中文包含判断及unicode

Python 字符编码与解码:unicode、str、中文

Python中解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 1: ordinal not in range(128)