0x00 問題引出:
最近在練習python爬蟲的時候,需要爬取網頁。
在使用urllib獲取reqest的response的時候,還要進行解碼。
見語句:
content = urllib.request.urlopen(request).read().decode()
當執行該語句的時候,會造成異常:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 259: invalid continuation byte
0xd3 問題分析
該情況是由於出現了無法進行轉換的 二進制數據 造成的,可以寫一個小的腳本來判斷下,是整體的字符集參數選擇上出現了問題,還是出現了部分的無法轉換的二進制塊:
#python3
#以讀入文件為例:
f = open("data.txt","rb")#二進制格式讀文件
while True:
line = f.readline() if not line: break else: try: #print(line.decode('utf8')) line.decode('utf8') except: print(str(line))
1.如果是字符集出現錯誤,建議多選擇幾種字符集測試一下: 選擇的經驗是: 如果是爬取到的網頁文件,可以查看網頁文件的meta標簽下的charset屬性值。
例如:
<meta charset="UTF-8">
也可以使用notepad++打開,查看下右下角的部位,會指示該文件是那種編碼。
2.有的情況,是這樣的,整個文件是好的,如果用notepad++打開后,能夠看到文件是可以打開的,似乎什么問題都沒有發生過,但是,用python進行解碼的時候,卻會出現錯誤。原因是因為這里的0xd3,這是無法轉換出來的部分,這是不屬於編碼字符集中的部分。所以,在進行編碼轉換的時候,會報錯。
0xd3 解決方法
修改字符集參數,一般這種情況出現得較多是在國標碼(GBK)和utf8之間選擇出現了問題。
出現異常報錯是由於設置了decode()方法的第二個參數errors為嚴格(strict)形式造成的,因為默認就是這個參數,將其更改為ignore等即可。例如:
line.decode("utf8","ignore")
問題解決
