查看原文
其他

encode 和decode——带你探索编码与解码的世界

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:孙晓玲

文字编辑:余术玲

技术总编:张   邯

重磅!!!爬虫俱乐部将于2019年10月2日至10月5日在湖北武汉举行Python编程技术培训,本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python编程技术,尤其是爬虫技术和文本分析技术。该培训目前在火热招生中,点击《爬虫俱乐部2019十一Python编程技术培训报名啦!》或点击文末阅读原文,了解培训详细信息,抓紧时间报名吧!
731日的推文中,已经为大家简单介绍了Unicode编码的由来,并且介绍了Python中查看单个字符编码的一对互逆函数ord(c)chr(i)。今天将继续为大家介绍Python中有关中文编码的小知识并介绍有关编码解码的两种数据处理方法encode decode

一、常见的中文编码
GB2312编码是在ASCII编码基础上扩展来的,在1980年由中国国家标准总局发布,其中最主要的变化就是引入了简体中文的编码,一共容纳了包括简体中文在内的6000多个字符。
仅仅是简体中文肯定是不够用的,1995年,GBK编码在GB2312编码的基础上进行扩充,加入了繁体中文和一些符号的编码,扩充后容纳了20000多个字符。
56个民族56枝花,中华儿女56个民族不同民族之间的语言符号也有一定的差异,为了编码大团圆,2000年,GBK再一次被扩充,就产生了GB18030编码,GB18030编码不仅容纳简体中文和繁体中文,还纳入少数民族汉字,一共70000多个汉字和字符,GB18030是在GB2312GBK的基础上扩充的,比GB2312GBK更广阔。

二、.encode()方法和.decode()方法
.encode( ).decode()分别称为编码方法和解码方法,字符串通过编码转换为字节码(一种二进制数据类型,如Unicode编码),字节码通过解码转换为可以被人类读懂的字符串。它们的关系如下图所示。

1.encode方法
encode方法能够将字符串转换成给定编码的字节形式,语法格式为:
str.encode(encoding=”code”,errors=”errorstype”)
encode方法对str类型数据进行处理,返回的是给定编码的字节形式;encoding设定编码的方法;errors设置所需要的错误处理方案,默认为“strict”,当发生与 Unicode 相关的编码错误时将被引发。示例如下:
str0= '爬虫俱乐部'byte0= str0.encode('gb2312') # 以gb2312编码对str0进行编码,获得bytes类型对象print(byte0)
结果如下:

输出结果为爬虫俱乐部的二进制编码。
2.decode方法
decode方法将给定编码的字节码解码为utf-8编码的字符串,语法格式为:
bytes.decode(encoding=”code”,errors=”errorstype”)
decode方法对bytes类型数据进行处理,返回的是字符串;encoding设定解码的方法,设定的解码方式应该与bytes的编码方式一致;errors设置所需要的错误处理方案,默认为“strict”,当发生与 Unicode 相关的解码错误时将被引发。示例如下:
str0= '爬虫俱乐部'byte0= str0.encode('gb2312') # 以gb2312编码对str0进行编码,获得bytes类型对象str1=byte0.decode('gb2312')# 对gb2312编码的byte0进行解码,获得str类型对象print(str1)
结果如下:

成功将爬虫俱乐部的二进制编码解码为字符串爬虫俱乐部


三、网络爬虫应用
前面已经为大家介绍过,默认情况下,Python 源码文件以 UTF-8 编码方式处理。但并非所有的网页的源代码都是UTF-8 编码的,较新的网页一般为UTF-8编码,一些有年代的网站可能是GB2312等其他编码方式,这样我们获取的网页源代码中的中文将出现乱码,或者post的表单需要使用GBK编码的字节流形式传送,encodedecode就能为我们解决问题。
以爬取新浪财经高管任职信息为例。在本例中,为了阅读简便我们选取平安银行的高管任职信息为例。新浪财经的网页源代码为GB2312编码,所以当我们直接打印网页源代码的文本格式数据时,中文就会显示乱码。
import requests #导入requests模块url="http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml"text=requests.get(url).text#通过requests 模块的get方式将源代码赋给textprint(text)
结果如下:

从输出结果可知,源代码中的中文部分都显示为乱码。用decode对源代码进行解码。我们已经知道GB18030是在GB2312的基础扩充且更全面,所以这里选取GB18030编码进行解码。
byte=text.decode(encoding="gb18030",errors="strict")print(byte)

结果如下:

发生报错,在介绍decode方法时说过,它的作用对象是bytes类型,但这里的.text是解码后的字符串类型,并且默认使用Unicode编码解码,因此.text不再适用。此时,我们需要提取原生字符串,即调用.content而非.text,然后使用decode进行解码。
import requestsurl="http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml"content=requests.get(url).content#将源代码的编码字节赋给contentbyte=content.decode(encoding="gb18030",errors="strict")print(byte)


调用content属性将源代码的字节码赋给content,再对content进行解码就能得到中文正常显示的源代码啦。
当然,此处也可以通过response对象自带的encoding属性得到正确的内容。
import requestsurl="http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml"text=requests.get(url)text.encoding= "gb18030"print(text.text)


接下来只需要对得到的正常显示的源代码文件进行字符串处理就可以得到我们想要的信息啦。欲知更加详细的字符串处理方法,持续关注爬虫俱乐部微信公众号,带你走上人生巅峰!


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

        字符串方法(二)

如何快速生成分组变量?

用Stata实现数据标准化

字符串方法介绍

Jupyter Notebook的使用

Stata16新功能之“框架”——frlink连接多个数据集(3)
Stata16新功能之“框架”——基础命令大合集(2)
三分钟教你读懂Python报错
解析XML文件

命令更新之reg2docx:将回归结果输出到word

命令更新之t2docx——报告分组均值t检验

爬虫俱乐部2019十一Python编程技术培训报名啦!

数据类型——Dict、Set与Frozenset简析

数据类型介绍——tuple、list和range对象
把pdf文件批量转成docx文件
格式化字符串方法的比较
朝花夕拾—— 如何输出内存中的矩阵与绘图
Stata16新功能——定义图形元素的绝对大小
Stata16新功能之“框架”——读入多个数据集(1)

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。



此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存