2012-11-17 70 views
2

我試圖用Python和BeautifulSoup這個文件解析:Python的UnicodeEncodeError /維基百科API

http://en.wikipedia.org/w/api.php?format=xml&action=opensearch&search=rage_against_the_machine

第七項下來,因爲這文本標籤:

憤怒反對機器的1994年-1995 巡迴演唱會

當我試圖打印出「對機器的憤怒」小號1994-1995之旅」,Python是給我這個:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 31: ordinal not in range(128)

我只需更換U '\ u2013' 以解決這個問題 ' - ',像這樣:

itemText = itemText.replace(u'\u2013', '-')

然而,我沒有編碼的每個角色呢?我不想忽視它們,也不想列出每一個可能的發現和替換。

當然,一個庫必須存在,試圖從一個常見的已知編碼列表中檢測編碼(但很可能是錯誤的)。

someText = getTextWithUnknownEncoding(someLocation); 
bestAsciiAttemptText = someLibrary.tryYourBestToConvertToAscii(someText) 

謝謝

+0

你在Windows上嗎? –

+0

*您如何*打印文本?到終端,到一個文件?你在任何地方連結(str1 + str2)嗎? –

+0

是否[如何在Windows中的控制檯中顯示原生語言?](http://stackoverflow.com/q/3473166)幫助? –

回答

1

其解碼爲UTF-8應該工作:

itemText = itemText.decode('utf-8') 
+0

通常,Python會檢測終端編解碼器。盲目編碼爲UTF-8在這裏不會有幫助。 –

+0

這不起作用我仍然得到相同的錯誤。 – szxnyc

-2

您可能需要顯式聲明的編碼。

在你的文件的第一行(或hashbang後,如果有的話),添加以下行:

-*- coding: utf-8 -*-

這種「神奇的意見」分裂勢力的Python期望UTF-8字符並應成功解碼它們。

更多細節:http://www.python.org/dev/peps/pep-0263/

+0

該註釋僅適用於*閱讀源代碼*,並且與輸出編碼無關。 –

+0

這不會更改源的行爲。 – szxnyc

0

通常情況下,你應該儘量保持字符爲Unicode或UTF-8。避免將字符轉換爲本地代碼頁,因爲這會導致信息丟失。

但是,如果你必須,這裏是。幾件事情要做。讓我們用你的例子字符:

>>> s = u'\u2013' 

如果你想打印字符串例如進行調試,您可以使用repr

>>> print(repr(s)) 
u'\u2013' 

在交互式會話,你可以只輸入變量名以達到相同的結果:

>>> s 
u'\u2013' 

如果你真的想給它的文本轉換爲您的本地代碼頁,並且此代碼頁外部的字符轉換爲'?',你可以使用這個:

>>> s.encode('latin-1', 'replace') 
'?' 

如果'?'不夠好,您可以使用translate將選定的字符轉換爲等效字符,如this answer