平常还觉得编码问题一般能水过去,到爬虫这真是"不信抬头看,苍天饶过谁"...

其实,Python2和Python3中对于编码已经发生了很大的改变(但其实是更方便了),我们一个个来讨论:

Python2

1.在Python2中默认编码为ASCII码

2.两种字符序列类型:str(以默认的ASCII码编码,可视为数据传输时的bytes数据类型),Unicode类型

3.两种类型的转化方式为:

Python3

1.在Python3中默认编码为Unicode

2.两种字符类型:str(以默认的Unicode编码),bytes数据类型

3.两种类型的转化方式为:

综上,我们已经了解完了Python2和Python3之间的编码差异

下面来介绍编码的影响,以Python3为例(Python2中就把str当做Python3中的bytes吧)

#-*- coding:utf-8 -*-

from urllib import request

with request.urlopen('http://www.baidu.com') as url:

bytes_web_data=url.read() #使用url对象的read()方法可以读取到网页的源代码

#由于无论是XML还是json,数据传输的类型都是以bytes数据类型进行传输

print('bytes数据类型下,网页源代码为:',bytes_web_data) #打印结果前有b''修饰,表示为bytes数据类型,不能显示中文字符

str_web_data=bytes_web_data=bytes_web_data.decode('utf-8') #将bytes按utf-8解码为str(Unicode编码),能显示中文字符

print('str数据类型下,网页源代码为:',str_web_data) #打印结果可显示中文字符了

with open('baidu.html','w',encoding='utf-8') as file: #以写的方式打开文件

file.write(str_web_data) #写文件,使用write函数只接受str(Unicode)

上述代码是可以顺利运行的,且运行结果会生成一个baidu.html文件,点击进入百度首页

其实,从注释中能提取出3个很重要的点:

1.不论是json还是XML,数据在传输时都是以bytes数据类型进行传输的。因此,从网页上read()到的东西也是bytes数据类型的

2.写文件只接受Unicode编码的,在Python3中即str。若将bytes作为参数,即file.write(bytes_web_data),则会报错:

3.windows在存储文件时会把其保存为系统的默认编码,由于Windows7下默认编码为GBK,所以如果我在open('baidu.html','w')中不加上encode='utf-8'则可能会出现下列错误:

就是因为操作系统默认编码的问题,会保存为GBK编码,所以有些utf-8下的编码无法解释,报错。

Ps,查找系统编码的方式,打开cmd,在命令行模式下输入chcp,输出结果为 活动代码页:936 ,则表明为GBK编码,剩余编码的对应方式为:

如果你有耐心看到这里的话,差不多已经知道在url上和写文件上的编码的基本知识了。