字符编码-爬虫乱码

问题起源是想抓下基金网站(http://gs.amac.org.cn/amac-infodisc/res/pof/fund/index.html)的数据,然后发现抓取下来的中文字符都是乱码。然后秉承着自己“把不太熟悉的东西弄清楚是最高效的学习方式”,就来整理了下python字符相关。

首先,常用的字符编码有unicode、utf-8、gbk、gb18380、GB2312和常见的ASCII
最早的编码是ASCII码(1字节),美国人设计,只包括字母数字和一些符号。
中国制定GB2312码(2字节)(现为gbk,notepad+中的ANSI编码方式),在ASCII码基础上增加了汉字
全球各语言通用编码Unicode(2字节甚至4字节)
因为unicode使用普遍和只使用英文时unicod占用他们多字节不优雅,出现‘utf-8’码–可变长编码.

然后是各编码的使用情景:
ASCII不用说
unicode全球网络通用,也是python3和计算机内存的默认编码。(运行时的内存)
中文windows下软件默认是GBK
计算机传输或者保存到硬盘中使用utf-8。所以使用时会硬盘的内容从存储时的utf-8转换成unicode供调用编辑、网页数据会从服务器的unicode内容转成utf-8。比如这个“ut-8”
在这里插入图片描述
介绍完编码就是常见的编码操作decode和encode,默认utf-8
这也是最常用的编码问题解决方式。
首先python默认unicode编码,所以可以直接中文输入
函数ord()、chr()获取编码或者获取编码对应字符
字符转换字节 a = b’demaxiya’
str有encode()方法
aaa.encode(‘utf-8’)
字节byte才有decode方法
b’demaxiya’.decode(‘ascii’)
转换时出现无效字节,可以errors = ‘ignore’
如b’demaxiya’.decode(‘ascii’,errors = ‘ignore’)
即 str—>(encode)—>bytes,bytes—>(decode)—>str
---- 来自‘’西欧伯爵‘’
sys包的sys.getdefaultencoding())可以显示当前编码
https://blog.csdn.net/qq_29053519/article/details/79170519这里可以参考这篇,我键盘有点失灵就不再加阐述)
encoding参数取值表:

      值                                      描述

‘ascii’ 7位Ascii码
‘latin-1’或’iso-8859-1’ ISO 8859-1 Latin-1
‘cp1252’ Windows 1252编码
‘utf-8’ 8位变长编码
‘utf-16’ 16位变长编码
‘utf-16-le’ UTF-16, 小尾编码
‘utf-16-be’ UTF-16, 大尾编码
‘unicode-escape’ 与unicode字面量u"string"相同的格式
‘raw-unicode-escape’ 与unicode字面量ur"string"相同的格式

errors参数取值表:
值 描述
‘strict’ 遇到编码和解码错误时,引发UnicodeError异常
‘ignore’ 忽略无效字符
‘replace’ 将无效字符替换为一个替换字符(Unicode中的U+FFFD,标准字符串中的’?’)
‘backslashreplace’ 将无效字符替换为python字符转义序列。例如,将字符U+1234替换为’\u1234’
‘xmlcharrefreplace’ 将无效字符替换为XML字符引用。例如,将字符U+1234替换为’&#4660’

常见问题就两种:
1 ‘gb2312’ codec can’t encode character u’\u56e7’ in position
某种编码方式(‘gb2312’)对某字符‘\u5647’不适用
造成这样的原因有很多,比如出现了gb2312不支持的生僻字,这时候转换成unicode编码就行了
我这里的解决方法就是
a = requests.get(url).text
aa = a.encode(‘raw_unicode_escape’)
aaa = aa.decode()

2 读写文件的时候,windows下记事本默认GBK,需要提前编码
f = open(“1.txt”,“w”,encoding=‘utf-8’)
如果文本中出现无法转换的字符,可以转换文本格式然后再open。
比如用notepad打开文件然后保存成“**.py”自动然后在f = open(“1.py”,“w”,encoding=‘utf-8’)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值