'gbk' codec can't encode character '\xa0' in position 12248: illegal multibyte sequence
阿新 • • 發佈:2018-12-04
在網上爬取一些位元組流出現了這個問題,明明是utf-8 的解碼卻出現了 ‘gbk’的錯誤
def getUrlListOne(url):
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,'
' like Gecko) Chrome/50.0.2661.94 Safari/537.36'}
target_req = request.Request(url=url, headers=header)
target_response = request.urlopen(target_req, timeout=3 )
target_html = target_response.read().decode('utf-8', 'ignore')
datas = BeautifulSoup(target_html, 'lxml')
print(datas)
現在打印出現了這個錯誤。。。。經過在度孃的幫助下發現:
1.字元就是unicode字元,字串就是unicode字元陣列
如果用以下程式碼測試,
print('a'=='\u0061')
會發現結果為True,足以說明兩者的等價關係。
2.str轉bytes叫encode,bytes轉str叫decode,如上面的程式碼就是將抓到的位元組流給decode成unicode陣列
我根據上面的錯誤資訊分析了位元組流中出現\xbb的地方,發現有個\xc2\xbb的特殊字元»,我懷疑是它無法被解碼。
用以下程式碼測試後
print(b'\xc2\xbb'.decode('utf-8'))
它果然報錯了:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xbb’ in position 0: illegal multibyte sequence
原來是print()函式自身有限制,不能完全列印所有的unicode字元。
知道原因後,google了一下解決方法,其實print()函式的侷限就是Python預設編碼的侷限,因為系統是win7的,python的預設編碼不是’utf-8’,改一下python的預設編碼成’utf-8’就行了
在方法下面加上就解決了:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') # 改變標準輸出的預設編碼