抓取网页源代码并保存为文件时出现乱码

首先明确两个概念:

  • 计算机中的编码(encode)==》字符->字节

  • 计算机中的解码(decode)==》字节->字符

    下面看两个例子:

    str="百度"
    bs=str.encode('gbk')
    print(bs)
    print(bs.decode('gbk'))
    
    bs=str.encode('utf-8')
    print(bs)
    print(bs.decode('utf-8'))
    

    运行结果如下:

抓取网页源代码并保存为文件时出现乱码

显而易见,使用不同的编码方式所耗费的字节数是不同的。比如使用gbk编码一个中文需要使用两个字节。而使用utf-8编码一个中文需要使用三个字节。

目前广泛使用的是Unicode字符集,常用的编码方式是utf-8,关于二者之间的区别和联系可参考字符编码笔记

回到主题:

我们可以使用requests.get(url)方法得到一个响应。

如果在写入文件时出现乱码,我们不妨看一下该响应的编码方式。

requests.get(url).encoding

一般来说出现乱码的话上面的结果都不会是utf-8

这里假定是gbk,执行下列代码:

with open('data.txt','w',encoding='gbk') as f:
	f.write(requests.get(url).text)

打开文件后可能发现中文还是乱码。

这是为什么呢?这是因为我们采用的编码方式虽然是gbk,但是文件解码方式默认可能是utf-8,从而导致中文乱码。

此时将文件的编码方式改为gbk即可。

但是上面的解决方案仍然有不便之处,因为utf-8是一种通用型的编码方式,如果每次打开文件后还要改变编码方式无疑是极其繁琐的。

所以第二种方式就是设置写入文件时的编码方式为utf-8。

with open('data.txt','w',encoding='utf-8') as f:
	f.write(requests.get(url).text)

原理与第一种方式相同,这里不再赘述!

上一篇:【wsn定位问题】基于chan算法求解wsn定位问题matlab源码


下一篇:MySQL修改表结构操作