【背景】http://www.tuicool.com/articles/nEjiEv
問題參見:
中的:
報錯的異常是
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence
此問題氯葬,還是很具有代表性的鱼辙,此處,專門整理如下:
【Python中如何處理UnicodeDecodeError和UnicodeEncodeError】
簡答:
1.仔細(xì)分析錯誤的類型
2.搞清自己處理的字符串是什么類型的
3.然后換用這種的字符編碼去編碼或解碼
詳解:
以上面的錯誤:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence
為例烧颖,去解釋闷盔,如何處理這類問題:
1.仔細(xì)分析錯誤的類型
(1)錯誤是Unicode的編碼還是解碼
對于此處与柑,錯誤是:
UnicodeDecodeError
的類型的庇谆。
此英文忌锯,對應(yīng)的中文的含義幔翰,其實已經(jīng)很清楚了:
Unicode的解碼(Decode)出現(xiàn)錯誤(Error)了
而對于上面這句漩氨,我們可以推斷出:
你當(dāng)前正在處理某種編碼類型的字符串
此處你要處理字符串西壮,是想要將該字符串去解碼decode,變成Unicode
但是將該字符串解碼變成Unicode期間叫惊,卻出錯了
(2)所用的是何種編碼
好的款青,接著看上面的錯誤:
‘gbk’ codec can’t decode
使得錯誤信息更加明顯了:
你此處,要將字符串解碼為Unicode霍狰,是以gbk編碼的方式去解碼(該字符串變成Unicode)的
但是此處通過gbk的方式抡草,卻無法解碼(can’t decode )
注:此處的codec,意思是:編解碼(器)蔗坯,是Python內(nèi)部的模塊康震,用來編碼或解碼(字符串)的
(3)錯誤位置
bytes in position 2-3
此處的信息,后續(xù)一般也很少用到步悠。
有時候會用于定位具體錯誤的位置签杈。
此處暫且忽略。
(4)錯誤的細(xì)節(jié)錯誤類型
illegal multibyte sequence
翻譯為中文為:
非法的鼎兽,多字節(jié)答姥,序列
簡單說就是:
沒法(解碼)了。
【原因及解決辦法】
好了谚咬,針對于上面所分析出來的信息:
將一個字符串鹦付,通過gbk的方式,去解碼择卦,想要獲得Unicode字符串敲长,結(jié)果出錯了
我們來說說原因和解決辦法:
此種錯誤,有幾種可能:
(1)要處理的字符串本身不是gbk編碼秉继,但是你卻以gbk編碼去解碼
比如祈噪,字符串本身是utf-8的,但是你卻用gbk去解碼utf-8的字符串尚辑,所以結(jié)果不用說辑鲤,則必然出錯
則必然會出現(xiàn)這類的錯誤,說是杠茬,用gbk的方式去解碼字符串月褥,想要獲得Unicode字符串,但是結(jié)果卻解碼出錯了
解決辦法:
如果你確定當(dāng)前字符串瓢喉,比如抓取網(wǎng)頁通過charset=utf-8宁赤,已經(jīng)確定html的字符串是utf-8的,
則可以直接去通過utf-8去解碼栓票。
相關(guān)參考內(nèi)容:
詳解抓取網(wǎng)站决左,模擬登陸,抓取動態(tài)網(wǎng)頁的原理和實現(xiàn)(Python,C#等)
中的:
【整理】關(guān)于HTML網(wǎng)頁源碼的字符編碼(charset)格式(GB2312哆窿,GBK链烈,UTF-8,ISO8859-1等)的解釋
而如果本身對于所處理的字符串挚躯,不太清楚是什么編碼類型的强衡,可以嘗試去通過chardet等模塊,去檢測看看:
【教程】如何用Python中的chardet去檢測字符編碼類型
然后搞清楚了码荔,確定了漩勤,字符串是什么類型,然后再去解碼缩搅。
提示:
關(guān)于字符串編碼的類型越败,作為背景學(xué)習(xí)知識,也應(yīng)該去了解一下硼瓣。
這樣對于以后處理字符串方面究飞,會更有幫助。
(2)你沒有主動的去將字符串編碼為對應(yīng)的Unicode堂鲤,但是結(jié)果也報上面的UnicodeDecodeError的錯誤
這個情況亿傅,最常見的,就是我之前在:
【總結(jié)】Python 2.x中常見字符編碼和解碼方面的錯誤及其解決辦法
所整理過的:
“Python中瘟栖,打印字符串時葵擎,字符串本身的編碼,與輸出終端中所用編碼不匹配”
此處不再贅述半哟,只簡要再說一下:
如果你本身拿到的是utf-8等酬滤,非gbk編碼的字符串,然后用print去打印出來
在windows系統(tǒng)就是輸出到cmd中
而cmd中寓涨,(對于多數(shù)中國人所用的是中文的系統(tǒng))默認(rèn)字符編碼是gbk
從而導(dǎo)致此種現(xiàn)象:
python要將utf-8編碼的字符串盯串,在gbk的cmd的中打印出來
所以先要去嘗試,用gbk的編碼戒良,解碼為Unicode然后再打印出來
結(jié)果就出現(xiàn)此處的錯誤了嘴脾。
詳細(xì)解釋,還是參見上面的教程蔬墩。
其中還有示例代碼的。
(3)處理的字符的確是gbk的耗拓,但是其中夾雜的部分特殊字符拇颅,是gbk編碼中所沒有的
如果有些特殊字符是GB18030中有的,但是是gbk中沒有的乔询。
則用gbk去解碼樟插,去所不支持的字符,也比如會出錯。
所以黄锤,此種情況搪缨,可以嘗試用和當(dāng)前編碼(gbk)所兼容的但所包含字符更多的編碼(gb18030)去解碼,或許就可以了鸵熟。
提示:
如果對于GBK副编,GB18030,以及GB2312不了解流强,則可參考:
另外:
如果遇到其他的痹届,類似此中錯誤的,比如:
UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence
等類型的錯誤打月,你就可以按照上述的思路队腐,去分析,錯誤的現(xiàn)象奏篙,原因柴淘,然后通過自己,就可以找到解決辦法了秘通。
注:
其他和這類錯誤相關(guān)的为严,也還有一些可以參考的:
【總結(jié)】靜態(tài)網(wǎng)頁抓取,動態(tài)網(wǎng)頁抓取充易,模擬登陸的注意事項和心得
中的:“返回的html內(nèi)容是亂碼”