2013-01-12 32 views
0

我有一個腳本這就是通過數據庫循環和與替換一些文本與其他文本一起在弦上做一些beautifulsoup處理等python - 如何將html字符串轉換爲utf-8?獲取的UnicodeDecodeError錯誤

這工作100%的大部分時間,但一些HTML斑點似乎包含這打破了以下錯誤的腳本Unicode文本:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 112: ordinal not in range(128) 

我不知道在這種情況下做什麼,沒有人知道一個模塊/功能的強制所有的文本字符串中要一個標準化的UTF-8什麼的?

數據庫中的所有html blob都來自feedparser(下載rss提要,以db存儲)。

+0

您知道使用哪種編碼?如果沒有,那麼你必須猜測它,轉換爲Unicode並重新保存數據爲UTF-8。美麗的解析器通常擅長猜測編碼,但您也可以嘗試['chardet'](http://pypi.python.org/pypi/chardet)。 – Bakuriu

+0

嘗試使用'.encode(「utf8」)'或'.encode(「utf-8」)' – Amyth

+2

在沒有看到產生錯誤的腳本的情況下很難提供幫助。 –

回答

0

在你與你的字符串變量任何進一步的處理:

clean_str = unicode(str_var_with_strange_coding, errors='ignore') 

一團糟的字符被跳過。不夠優雅,因爲您不嘗試恢復任何可能有意義的值,但很有效。

1

由於您不想向我們展示您的代碼,因此我將給出一個一般答案,希望能幫助您找到問題。

當您第一次從數據庫中獲取數據並使用fetchone獲取數據時,需要將其轉換爲unicode對象。一旦有變量,就儘快做到這一點,然後只有在輸出變量時纔對其進行重新編碼。

db = MySQLdb.connect() 
cur = db.cursor() 
cur.execute("SELECT col FROM the_table LIMIT 10") 
xml = cur.fetchone()[0].decode('utf-8') # Or whatever encoding the text is in, though we're pretty sure it's utf-8. You might use chardet 

運行xml通過BeautifulSoup後,您可能,如果它被保存到一個文件或者你可能只是把它作爲一個Unicode對象,如果你重新將其插入到數據庫再次encode的字符串。

0

確保你真正瞭解什麼是unicodeUTF-8之間的差異,這是不一樣的(什麼是許多驚喜)。那就是The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

什麼是你的數據庫的編碼?它真的是UTF-8還是你只有假設它是?如果它包含隨機編碼的斑點,那麼你有問題,因爲你cannot guess the encoding。當你從數據庫讀取數據,然後decode blob unicode並在代碼中稍後使用unicode。

但假設您的基礎是UTF-8。那麼你應該使用unicode everywhere - decode early, encode late。在你的程序裏面隨處可以使用unicode,只有在讀取或寫入數據庫,顯示,寫入文件等時才解碼/編碼。

Unicode和編碼在Python 2.x中有點痛苦,幸運的是在Python 3中all text is unicode

關於BeautifulSoup,請使用最新的version 4

0

經過幾個小時的搜索後,我終於找到了一個解決方案,消除了所有的解碼錯誤。我仍然是相當新的python(沉重的PHP背景),並不理解字符編碼。

在我的代碼中,我有一個.decode('utf-8'),之後做了一些.replace(str(beatiful_soup_tag),'')語句。解決方案最終變得如此簡單,以至於將所有str()更改爲unicode()。之後,沒有一個問題。

答發現: http://ubuntuforums.org/showthread.php?t=1212933

我真誠地道歉,誰請我張貼代碼,我認爲是堅如磐石,而不是問題是完全相反的,我敢肯定他們會抓住提意見這個問題馬上!我不會再犯這個錯誤! :)

+0

很高興它已經適合你。不過,如果您從任意隨機互聯網頁面獲取輸入數據,則可以等待下一個錯誤,因爲某些頁面提供混合編碼。非常有名,貨幣符號ISO 8859編碼在其他完整的unicode頁面。如果遇到這些錯誤,請在將字符串轉換爲unicode時記住errors ='ignore'標誌。 – Michael

+0

會做,謝謝邁克爾 – Joe

相關問題