2009-07-09 173 views
0

我正在提取一個網頁(http://autoweek.com)並試圖處理它,但出現編碼錯誤。汽車週刊宣稱 「ISO-8859-1」 編碼和有單詞 「紐伯格林」(U與變音符號)Unicode問題Django-Python-URLLIB-MySQL

我做的:

# -*- encoding: utf-8 -*- 
import urllib 
webpage = urllib.urlopen(feed.crawl_url).read() 
webpage.decode("utf-8") 

它給了我下面的錯誤:

'utf8' codec can't decode bytes in position 7768-7773: unsupported Unicode code range" 

如果我繞過.decode步驟並使用lxml庫進行一些解析,則在將解析標題保存到數據庫時會引發錯誤:

'utf8' codec can't decode bytes in position 45-50: unsupported Unicode code range 

我的數據庫有字符集UTF8和整理的UTF-一般-CI

我的設置:
Django的
的Python 2.4.3
的MySQL 5.0.22
的MySQL-python的1.2.1
mod_python的3.2.8

回答

0

autoweek.com似乎對自己的編碼感到困惑。它聲明衝突的字符集的定義:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

後來......

<meta charset=iso-8859-1"/>. 

ISO-8859-1,因爲這正確的從Web服務器的報頭和由.info()方法返回(並且它實際解碼),但是這表明您不一定依賴網頁中的Content-Type聲明。你應該遵循lavinio描述的方法。

3

如果webpage聲明編碼爲iso-8859-1,難道你不能僅僅做webpage.decode("iso-8859-1")

此時,webpage已解碼爲您的應用。當它被寫入數據庫時​​,那裏的映射應該處理char-to-utf8編碼。

爲了獲得正確的編碼,或者告訴網絡服務器你只接受UTF-8,然後這就是你會(總是)總是得到的,因爲幾乎每個人都讀取UTF-8(或者你可以嘗試它與ISO-8859-1);或者使用.info檢查返回的流的編碼名稱。詳情請參閱urllib2 - The Missing ManualQuick reference to HTTP headers

+0

我需要序列化此解決方案的所有頁面(不同的編碼)我正在抓取。所以我必須提取,提取編碼(如果聲明的話)然後解碼。 任何更簡單的解決方案? – 2009-07-09 03:54:59