python爬虫编码彻底解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36278071/article/details/79660196

目录

编码原理及区别

  • 第一阶段:编码的由来:大家都知道计算机的母语是英语,英语是由26个字母组成的。所以最初的计算机字符编码是通过ASCII来编码的,也是现今最通用的单字节编码系统,使用7位二进制数来表示所有的字母、数字、标点符号及一些特殊控制字符,作为美国编码标准来使用。
  • 第二阶段:由于计算机的不断普及,计算机进入了不同的国家和地区。很快表现出了众多的水土不服的症状。比如:中国人就表示不服,就不能让计算机说中文吗?但是ASCII编码用上浑身解数256个字符也不够中文用啊。
    因此后来出现了Unicode编码。Unicode编码通常由两个字节组成,共表示256*256个字符,即所谓的UCS-2。某些生僻的字还会用到四个字节,即UCS-4。Unicode向下兼容ASCII。
  • 第三个阶段:在Unicode中,很快,美国人不高兴了,原本用一个字节就够了,现在却要用两个字节来表示,非常浪费存储空间和传输速度。人们再发挥聪明才智,于是出现了UTF-8编码。主要针对空间浪费的问题。UTF-8从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。解决了空间浪费的问题,并且兼容老大哥ASCII编码。这样一些老古董软件在UTF-8编码中可以继续工作了。
    另外需要注意的是汉字在Unicode编码和UTF-8编码中通常是不同的。
  • 第四个阶段:同样我们祖国也制定了自己的一套标准。那就是GB2312和GBK。但是大多数还是直接用的UTF-8。UTF-8/UTF-16等是对Unicode进行了编码,是其一种实现方式。
    另外还有ISO-8859-1,ISO-8859-1是单字节编码,向下兼容ASCII,是许多欧洲国家使用的编码标准。
    Unicode是国际通用的编码标准,可以表示全世界的字符,但其字符集也是最复杂、占用空间最大的。开发者可以根据需要进行选择编码方式。

编码与解码

decode:编码
encode:解码
如下图:
编码与解码
可以看出Unicode充当的一个翻译官的角色,(差不多所有的编码方式都可转化为Unicode)

爬取中文百度首页

第一步:


import requests
url=’https://www.baidu.com/
html=requests.get(url).text
print(html)

输出错误的结果如下图
错误提示
很明显是编码的问题,让我们来看看百度用的什么编码。
百度编码
再看看我们自己用的编码:
python编码
那么问题来了,同样都是utf-8为什么会出现GBK错误呢?

第二步:

这个原因确实弄的我脑壳痛,怎么也找不到原因,各种编码都试过了结果还是不行。后来我想能不能直接输出它的编码方式。于是有了下面的结果。
编码方式
好家伙!原来你他妈的不是utf-8编码。把我害的好苦啊!
至于为什么是‘ISO-8559-1’编码我个人猜的应该是下载网页的时候解压缩导致的。注意啊是我猜的,我没去看,有空去看看

第三步:

这下好了,应该可以解决了!
编码格式
着实有些尴尬,按道理说应该能够输出正确答案了呀!可现在却什么都没了。于是我又想起了有一个输出格式的,我猜应该是这个原因。
于是我添加了如下代码

import io
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

编码成功
到这里,这次编码风波终于过去了!

BeautifulSoup库

解决编码问题期间看到别人写的python代码,突然发现一个很好用的包,BeautifulSoup。于是我也装了个完了玩。
将下载下来的百度的源码生成了一个soup对象,于是有了后面的漂亮的格式。
添加代码如下:

from bs4 import BeautifulSoup
#使用ISO-8859-1解码之后的代码
soup = BeautifulSoup(html)
print(soup.prettify())

效果如下:
beautifulsoup
是不是漂亮多了!
其实BeautifulSoup的功能远不止次,之后的应用过一段时间补上。
到此这篇博客就结束了,这篇博客也是治好了我多年的心病,就以为这个梗弄的我好久没有用过python爬虫了,现在解决了,以后一定会勤加练习。

参考资料

感谢以下资料给了我灵感
寒舟独饮的博客
脚本之家的文章
bw13的博客
火贪三刀的博客

猜你喜欢

转载自blog.csdn.net/qq_36278071/article/details/79660196