2011-11-10 98 views
0

我一直在這個小時裏堵塞,我似乎無法完成它的底部。 我已經詳細瞭解了這個網站,雖然其他人似乎也有類似的問題,但他們提供的解決方案並不適合我。編碼UnicodeDecodeError的Python編碼

我有一個python腳本,它讀取一個網站的HTML,並使用美麗的湯來尋找像head,body,H1等等的東西,然後將它們存儲在utf-8 MySQL表中。

似乎直線前進,但我一直運行到:

UnicodeDecodeError: 'ascii' codec can't decode byte xxxxxx 

當我編碼。我已經盡了一切努力來阻止這種情況發生,但無濟於事。 下面是代碼的一個版本:

soup = BeautifulSoup(strIndexPage) 
strIndexPageBody = str(soup.body) 
strIndexPageBody = strIndexPageBody.encode('ascii', 'ignore') # I know ignore is not best practice but I am really not interested in anything outside the ascii character set 
strIndexPageBody = strIndexPageBody .replace('"','"') 
strIndexPageBody = strIndexPageBody .replace("'","&rsquo") 

的早期版本,我想轉換爲UTF-8更好地工作,但我在一些結束與

` 

字符存在破壞MySQL插入/更新的HTML。 很顯然,我已經嘗試搜索這個字符並將其替換,但是然後python告訴我在我的代碼中有一個非ascii字符!

我讀過噸是文章,說我應該首先看HTML的編碼,解碼,然後編碼,以適應,但編碼並不總是從BS回來,和/或沒有在HTML中聲明。

我相信有一個簡單的解決方法,但我找不到它。

感謝您的任何幫助。

+1

不應該以分號結尾嗎?也和'''不一樣。 –

+0

請停止關注最後兩行 - 他們不是錯誤的地方。如錯誤消息所示,它在編碼時出錯。 – dan360

+0

2.6.5在CentOS上 – dan360

回答

5

請注意,您正在從編碼調用中獲取解碼錯誤。這是Python 2最醜陋的部分:它可以讓你嘗試編碼一個已編碼的字符串,首先解碼爲ascii。你在做什麼是相同的:

s.decode('ascii', 'strict').encode('ascii', 'ignore') 

我想這應該做你所期望的:

soup = BeautifulSoup(strIndexPage) 
strIndexPageBody = unicode(soup.body) 
strIndexPageBody = strIndexPageBody.encode('ascii', 'ignore') 

請注意,我們調用unicode的,所以我們得到一個Unicode字符串,我們可以有效地嘗試編碼。

+0

如果'soup.body'是一個編碼非ascii字符的str對象,那麼將它傳遞給'unicode'會給出一個'UnicodeDecodeError';另一方面,如果它已經是一個unicode對象,那麼將它傳遞給'unicode'是多餘的。 – ekhumoro

+0

@ekhumoro:它是'BeautifulSoup.Tag'對象,可以用'str'或'unicode'拼合。 –

+0

是的,抱歉 - 我大概應該猜到了:/ – ekhumoro

2

BeautifulSoup的UnicodeDammit應該能夠檢測文檔的編碼,即使它沒有被指定。

,當你有問題?:

from BeautifulSoup import UnicodeDammit 

UnicodeDammit(html_string).unicode 

哪些具體的代碼行拋出的錯誤,我們可以有問題的HTML樣本頁面上運行此會發生什麼?

+0

我早些時候瀏覽了一遍 - 我會試一試並回報 - 感謝您的幫助。 – dan360

+0

問題是,在使用BeautifulSoup解析頁面時,UnicodeDammit是默認設置,你不需要做任何特殊的事情。 – Acorn

+0

我看到 - BS沒有錯誤 - 當我嘗試對它進行編碼時發生錯誤。 – dan360

相關問題