2012-01-29 81 views
0

我試圖用urllib2下載一個網頁並保存到MySQL數據庫。 這樣的:python utf-8 HTML解碼錯誤

result_text = result.read() 
result_text = result_text.decode('utf-8') 

但是我得到這個錯誤:

數據: 'utf-8' 編解碼器不能解碼字節均爲0x88

現在,HTML meta標籤規定,編碼確實是utf-8。 香港專業教育學院設法解決這個問題這條線:

result_text = result_text.decode('utf-8','replace') 

它取代了壞人的角色。但是,我不確定這不是說明下載的數據可能有問題,或者我刪除了有價值的字符。 IU應該添加頁面也包含JavaScript - 儘管這不應該是我相信的問題。

有誰能告訴我爲什麼會發生這種情況? 感謝

+1

你確定頁面上的所有字符都是utf-8嗎?儘管標題說明,它可能是「一個謊言」 – DonCallisto 2012-01-29 14:02:28

+4

當你得到''utf8'編解碼器不能解碼字節0x88'錯誤時,它也應該告訴你有問題的字節的位置。如果該位置是'n',則在調用decode('utf-8')'之前添加一個print語句:'print(repr(result_text [n-20:n + 20]))',併發布結果在這裏。 – unutbu 2012-01-29 14:02:36

+1

因爲您沒有發佈鏈接到源數據,我們無法給您一個正確的答案。 但是,源數據很可能具有錯誤的UTF-8編碼,因此您無法做到這一點。 – 2012-01-29 14:36:34

回答

0
你的小數據樣本的

分析:

>>> s = "\x98cW\x01\xa2\xbb\xba\xcc\xec\x90\xfc\xffP\xcb%\x01\x08" 
>>> u = s.decode('utf8', 'replace') 
>>> u 
u'\ufffdcW\x01\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd%\x01\x08' 
>>> u.count(u'\ufffd') 
9 
>>> len(u) 
16 

(1)這當然不是偶然的無效序列UTF-8;超過50%的Unicode字符無效。換句話說,按下並使用data.decode('utf8', 'replace')不是一個好主意(基於此TINY示例)。 (2)人物\x01(兩次)和\x08讓我懷疑你有二進制數據莫名其妙。

(3)您在引用0x88評論中引用的(截斷的)錯誤消息,但示例數據中沒有0x88。 (4)請編輯您的問題以顯示您在開始時應該做的事情:(a)重現問題所需的最少代碼,包括您正在訪問的URL(b)完整的錯誤消息和回溯(c)保證你複製/粘貼(a)和(b)而不是從內存中打字

+0

好吧,讓我解決您的意見:1.真實,但唯一無效的序列是在這個「網址:」部分是小的,對我來說微不足道。 2.從代碼'result = proxy ['opener']。open(request)result_text = result.read() \t \t \t result_text.decode('utf-8')'url我無法透露。在不同的運行中我得到了不同的無效序列4.放心,我有複製/ psated。 – WeaselFox 2012-01-30 08:04:32