Python及requests亂碼問題的總結

烏拉拉_發表於2016-01-17

今天在用requests抓取網頁的時候,發現有個頁面,

r = requests.get(url)

s = r.text
s一直都有亂碼

以前每次碰到亂碼問題,解決完了就過去了,今天想好好研究一下,免得以後再遇到又不知道怎麼辦了。下面是一些總結:

以下為找到的資料:

字串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。 

decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字串str1轉換成unicode編碼。 

encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode('gb2312'),表示將unicode編碼的字串str2轉換成gb2312編碼。 

因此,轉碼的時候一定要先搞明白,字串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼


如果一個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷,用非unicode編碼形式的str來encode會報錯 

我看了一下待抓取的頁面,charset是gb2312

所以按照以上的說法,我先判斷了一下

isinstance(s, unicode)

顯示為True
既然如此,那我是否可以
s.encode('gb2312')
結果直接報錯

UnicodeEncodeError: 'gb2312' codec can't encode character u'\xbb' in position 317: illegal multibyte sequence

目前不知道是什麼原因,猜想是本來是gb2312,轉成unicode之後出現了gb2312不能解析的特殊字元?

既然如此,那我們就不要用unicode了

s = r.content
通過type(s)知道,s現在的型別是str,這樣再通過

s.decode('gb2312')
解碼,就沒有亂碼啦~

相關文章