深入浅出领略Python“乱码”题目
副问题[/!--empirenews.page--]
在爬取某网站时,网页的源代码呈现了中文乱码题目。之前关于爬虫乱码有各式百般的题目,本日与各人一路总结下关于收集爬虫的乱码处理赏罚。留意,这里不只是中文乱码,还包罗一些如日文、韩文 、俄文、藏文之类的乱码处理赏罚,由于他们的办理方法 是同等的,故在此同一声名。 一、乱码题目的呈现 就以爬取51job网站举例,讲讲为何会呈现“乱码”题目,怎样办理它以及其背后的机制。 代码示例:
表现功效: 打印res.text时,发明白什么?中文乱码!!!不外发明,网页的字符集范例回收的gbk编码名目。 我们知道Requests 会基于 HTTP 头部对相应的编码作出有按照的展望。当你会见 r.text 之时,Requests 会行使其展望的文本编码。你可以找出 Requests 行使了什么编码,而且可以或许行使r.encoding 属性来改变它。 接下来,我们一路通过resquests的一些用法,来看看Requests 会基于 HTTP 头部对相应的编码方法。
输出功效为: 可以发明Requests 展望的文本编码(也就是网页返回即爬取下来后的编码转换)与源网页编码纷歧致,由此可知其正是导致乱码缘故起因。 二、乱码背后的机密 当源网页编码和爬取下来后的编码转换纷歧致时,如源网页为gbk编码的字节约,而我们抓取下后措施直接行使utf-8举办编码并输出到存储文件中,这肯定会引起乱码,即当源网页编码和抓取下来后措施直接行使处理赏罚编码同等时,则不会呈现乱码,此时再举办同一的字符编码也就不会呈现乱码了。最终爬取的全部网页无论何种编码名目,都转化为utf-8名目举办存储。 留意:区分源网编码A-gbk、措施直接行使的编码B-ISO-8859-1、同一转换字符的编码C-utf-8。 在此,我们拓展讲讲unicode、ISO-8859-1、gbk2312、gbk、utf-8等之间的区别接洽,或许如下: 最早的编码是iso8859-1,和ascii编码相似。但为了利便暗示各类百般的说话,逐渐呈现了许多尺度编码。iso8859-1属于单字节编码,最多能暗示的字符范畴是0-255,应用于英文系列。很明明,iso8859-1编码暗示的字符范畴很窄,无法暗示中笔墨符。 1981年中国人民通过对 ASCII 编码的中文扩充改革,发生了 GB2312 编码,可以暗示6000多个常用汉字。但汉字其实是太多了,包罗繁体和各类字符,于是发生了 GBK 编码,它包罗了 GB2312 中的编码,同时扩充了许多。中国又是个多民族国度,各个民族险些都有本身独立的说话体系,为了暗示那些字符,继承把 GBK 编码扩充为 GB18030 编码。每个国度都像中国一样,把本身的说话编码,于是呈现了各类百般的编码,假如你不安装响应的编码,就无法表明响应编码想表达的内容。终于,有个叫 ISO 的组织看不下去了。他们一路缔造了一种编码 UNICODE ,这种编码很是大,大到可以容纳天下上任何一个笔墨和符号。以是只要电脑上有 UNICODE 这种编码体系,无论是环球哪种笔墨,只必要生涯文件的时辰,生涯成 UNICODE 编码就可以被其他电脑正常表明。UNICODE 在收集传输中,,呈现了两个尺度 UTF-8 和 UTF-16,别离每次传输 8个位和 16个位。于是就会有人发生疑问,UTF-8 既然能生涯那么多笔墨、标记,为什么海内尚有这么多行使 GBK 等编码的人?由于 UTF-8 等编码体积较量大,占电脑空间较量多,假如面向的行使人群绝大部门都是中国人,用 GBK 等编码也可以。 也可以这样来领略:字符串是由字符组成,字符在计较机硬件中通过二进制情势存储,这种二进制情势就是编码。假如直接行使 “字符串↔️字符↔️二进制暗示(编码)” ,会增进差异范例编码之间转换的伟大性。以是引入了一个抽象层,“字符串↔️字符↔️与存储无关的暗示↔️二进制暗示(编码)” ,这样,可以用一种与存储无关的情势暗示字符,差异的编码之间转换时可以先转换到这个抽象层,然后再转换为其他编码情势。在这里,unicode 就是 “与存储无关的暗示”,utf—8 就是 “二进制暗示”。 三、乱码的办理要领 按照缘故起因来找办理要领,就很是简朴了。 要领一:直接指定res.encoding
要领二:通过res.apparent_encoding属性指定
要领三:通过编码、解码的方法
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |