有的網(wǎng)頁是gb2312編碼,則需要將response.body判斷編碼,并解碼
#檢查編碼
def check_encoding(self,response):
import chardet
#
#detect傳入的是bytes
# 返回{'confidence': 0.99, 'encoding': 'GB2312'}
# 'encoding': 'utf-8'
encoding_info = chardet.detect(response.body)
encoding = encoding_info.get('encoding')
#非utf-8則解碼
if encoding != 'utf-8':
# 如果是gb2312,則用gbk來解碼,gbk可以解碼繁體字以及日文假文等,解碼更強(qiáng)
if encoding.lower()=='gb2312':
encoding = 'gbk'
new_body = response.body.decode(encoding)
#替換原來的body內(nèi)容
response = response.replace(body=new_body)
return response
另外關(guān)于gb2312和gbk解碼
問題:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
原因:Python在做將普通字符串轉(zhuǎn)換為unicode對象時,
例如:u_string = unicode(string , "gb2312"),如果你的字符串string中有諸如某些繁體字,例如"河滘小學(xué)"
中的滘,那么gb2312作為簡體中文編碼是不能進(jìn)行解析的,必須使用國標(biāo)擴(kuò)展碼gbk,gbk支持繁體中文和日文假文
解決方法:使用gbk,代替gb2312,例如:u_string = unicode(string , "gbk")