平常还觉得编码问题一般能水过去,到爬虫这真是"不信抬头看,苍天饶过谁"...
其实,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上和写文件上的编码的基本知识了。