1. 程式人生 > >'gbk' codec can't encode character '\xa0' in position 12248: illegal multibyte sequence

'gbk' codec can't encode character '\xa0' in position 12248: illegal multibyte sequence

在網上爬取一些位元組流出現了這個問題,明明是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') # 改變標準輸出的預設編碼