Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案
0x00 問題引出:
最近在做一個買房自動化分析Python腳本,需要爬取網頁。
在使用urllib獲取reqest的response的時候,還要進行解碼。
見語句:
result = res.decode('utf-8')
當執行該語句的時候,會造成異常:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 103339: invalid continuation byte
0x01 問題分析
該情況是由于出現了無法進行轉換的二進制數據造成的,可以寫一個小的腳本來判斷下,是整體的字符集參數選擇上出現了問題,還是出現了部分的無法轉換的二進制塊:
#python3 #以讀入文件為例: f = open("data.txt", "rb") #二進制格式讀文件 while True:line = f.readline()if not line:breakelse:try:# print(line.decode('utf8'))line.decode('utf8')# 為了暴露出錯誤,最好此處不printexcept:print(str(line))手寫了一段代碼,可以通過這段代碼的輸出來判斷哪里出現了問題。
1.如果輸出的代碼都是hex形式的,可能就是你選擇的解碼字符集出現了錯誤。對于python2.7 版本的來說,網上有使用這樣一種看上去很霸氣,其實很low的方式,來處理:
#coding=utf8 import sys reload(sys) sys.setdefaultxxxx("utf8")其實,這可以看做是python2系列版本的小bug,需要自行重新設置一下默認的編碼字符集,如果還要這么設置的話,decode()的參數還拿來干嘛。
所以,在python3版本中,就已經取消了這個方法。
2.如果是字符集出現錯誤,建議多選擇幾種字符集測試一下:選擇的經驗是:如果是爬取到的網頁文件,可以查看網頁文件的meta標簽下的charset屬性值。
例如:
<meta charset="UTF-8">
也可以使用notepad++打開,查看右下角的部位,會指示該文件時哪種編碼。
3.有的情況,是這樣的,整個文件是好的,如果用notepad++打開后,能夠看到文件是可以打開的,似乎什么問題都沒有發生過,但是,用python進行解碼的時候,卻會出現錯誤。
我們運行上面的測試腳本,可以看到出現這樣的情況:
<li id="J_menuHistory" data-page="J_pageHistory">
? ? ? ? ?<a><i class="icon-history"></i>播放歷史? ? \0xe5</a>
當然,這段代碼是我隨手寫的一個例子,這里,可以注意看到這個0xe5,這是無法轉換出來的部分,這是不屬于編碼字符集中的部分。所以,在進行編碼轉換的時候,會報錯。
0x03 解決方法
? ? 1.修改字符集參數,一般這種情況出現得較多是在國標碼(GBK)和utf8之間選擇出現了問題。
? ? 2.出現異常報錯是由于設置了decode()方法的第二個參數errors為嚴格(strict)形式造成的,因為默認就是這個參數,將其更改為ignore等即可。例如:
line.decode("utf8", "ignore")
?
?
總結
以上是生活随笔為你收集整理的Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git warning: LF will
- 下一篇: notepad去除每行空格后面的所有的内