python爬虫——中文编码

 

目录

 

 

编码原理及区别

  • 第一阶段:编码的由来:大家都知道计算机的母语是英语,英语是由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爬虫了,现在解决了,以后一定会勤加练习。

python学习资料领取看主页简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值