詳解Python解決抓取內(nèi)容亂碼問(wèn)題(decode和encode解碼)
一、亂碼問(wèn)題描述
經(jīng)常在爬蟲(chóng)或者一些操作的時(shí)候,經(jīng)常會(huì)出現(xiàn)中文亂碼等問(wèn)題,如下
原因是源網(wǎng)頁(yè)編碼和爬取下來(lái)后的編碼格式不一致
二、利用encode與decode解決亂碼問(wèn)題
字符串在Python內(nèi)部的表示是unicode編碼,在做編碼轉(zhuǎn)換時(shí),通常需要以u(píng)nicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字符串轉(zhuǎn)換成unicode編碼,如str1.decode(‘gb2312'),表示將gb2312編碼的字符串str1轉(zhuǎn)換成unicode編碼。
encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串,如str2.encode(‘utf-8'),表示將unicode編碼的字符串str2轉(zhuǎn)換成utf-8編碼。
decode中寫(xiě)的就是想抓取的網(wǎng)頁(yè)的編碼,encode即自己想設(shè)置的編碼
代碼如下
#!/usr/bin/env python # -*- coding:utf-8 -*- # author: xulinjie time:2017/10/22 import urllib2 request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/') RES=urllib2.urlopen(request).read() RES = RES.decode('gb2312').encode('utf-8')//解決亂碼 wfile=open(r'./1.html',r'wb') wfile.write(RES) wfile.close() print RES
或者
#!/usr/bin/env python # -*- coding:utf-8 -*- # author: xulinjie time:2017/10/22 import urllib2 request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/') RES=urllib2.urlopen(request).read() RES=RES.decode('gb2312') RES=RES.encode('utf-8') wfile=open(r'./1.html',r'wb') wfile.write(RES) wfile.close() print RES
但是還要注意:
如果一個(gè)字符串已經(jīng)是unicode了,再進(jìn)行解碼則將出錯(cuò),因此通常要對(duì)其編碼方式是否為unicode進(jìn)行判斷
isinstance(s, unicode)#用來(lái)判斷是否為unicode
用非unicode編碼形式的str來(lái)encode會(huì)報(bào)錯(cuò)
所以最終可靠代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- # author: xulinjie time:2017/10/22 import urllib2 request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/') RES=urllib2.urlopen(request).read() if isinstance(RES, unicode): RES=RES.encode('utf-8') else: RES=RES.decode('gb2312').encode('utf-8') wfile=open(r'./1.html',r'wb') wfile.write(RES) wfile.close() print RES
三、如何找到需要抓取的目標(biāo)網(wǎng)頁(yè)的編碼格式
1、查看網(wǎng)頁(yè)源代碼
如果源代碼中沒(méi)有charset編碼格式顯示可以用下面的方法
2、檢查元素,查看Response Headers
以上所述是小編給大家介紹的Python解決抓取內(nèi)容亂碼問(wèn)題(decode和encode解碼)詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
python實(shí)現(xiàn)學(xué)生管理系統(tǒng)開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)學(xué)生管理系統(tǒng)開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07Python進(jìn)行Restful?API開(kāi)發(fā)實(shí)例詳解
這篇文章主要介紹了Python進(jìn)行Restful?API開(kāi)發(fā)實(shí)例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03python編程PyAutoGUI庫(kù)使用與安裝簡(jiǎn)介
這篇文章主要為大家介紹了python編程中PyAutoGUI庫(kù)的使用與安裝簡(jiǎn)單介紹,文中含有視頻詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10python中無(wú)法導(dǎo)入本地安裝好的第三方庫(kù)問(wèn)題
這篇文章主要介紹了python中無(wú)法導(dǎo)入本地安裝好的第三方庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Python Selenium Cookie 繞過(guò)驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
這篇文章主要介紹了Python Selenium Cookie 繞過(guò)驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04