2010-08-13 91 views
0

在此代碼:編碼解碼有問題。蟒蛇。 Django的。 BeautifulSoup

soup=BeautifulSoup(program.Description.encode('utf-8')) 
    name=soup.find('div',{'class':'head'}) 
    print name.string.decode('utf-8') 

錯誤發生時,我正在試圖打印或保存到數據庫中。

dosnt梅特我在做什麼:

print name.string.encode('utf-8') 

或只是

print name.string 


Traceback (most recent call last): 
    File "./manage.py", line 16, in <module> 
    execute_manager(settings) 
    File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/__init__.py", line 362, in execute_manager 
    utility.execute() 
    File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/__init__.py", line 303, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/base.py", line 195, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/cluster/dynamic/virtualenv/lib/python2.5/site-packages/django/core/management/base.py", line 222, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/cluster/dynamic/website/video/remmedia/management/commands/remmedia.py", line 50, in handle 
    self.FirstTimeLoad() 
    File "/usr/local/cluster/dynamic/website/video/remmedia/management/commands/remmedia.py", line 115, in FirstTimeLoad 
    print name.string.decode('utf-8') 
    File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordinal not in range(128) 

這是再版(name.string)

U'\ u0412 \ u044b \ u043f \ u0443 \ u0441 \ u043a \ u043a \ u0442 27 \ u0434 \ u0435 \ u043a \ u0430 \ u0431 \ u0440 \ u044f'

+0

請寄出'print(repr(name.string))'和'print(sys.stdout.encoding)'的輸出。 – unutbu 2010-08-14 08:46:09

回答

5

我不知道你正在嘗試與name.string.decode('utf-8')做。作爲BeautifulSoup文檔eloquently points out,「BeautifulSoup給你Unicode,詛咒」。因此name.string已被解碼 - 它是unicode。你可以編碼它回到utf-8如果你想,但你不能再解碼它。

0

編輯name.string來自BeautifulSoup,所以它可能已經是unicode字符串。

然而,你的錯誤消息提到「ASCII」:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: 
ordinal not in range(128) 

按照PrintFails Python wiki page,如果Python不知道或 不能確定什麼樣的編碼輸出設備期待的,它集 SYS .stdout.encoding爲Noneprint嘗試使用'ascii'編解碼器對 進行編碼。

我相信這是你問題的原因。如果print sys.stdout.encoding打印None,您可以通過查看 來確認。

根據上面鏈接的相同頁面,您可以通過 明確告知Python使用哪種編碼來解決問題。你這樣做,在StreamWriter一個實例來包裝 sys.stdout的:

例如,你可以試試print語句前加上

import sys 
import locale 
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout) 

到腳本。您可能必須將 locale.getpreferredencoding()更改爲顯式編碼(例如'utf-8', 'cp1252'等)。要使用的正確編碼取決於您的輸出設備。 它應該設置爲輸出設備所期望的任何編碼。如果 正在輸出到終端,則終端可以具有菜單設置,以允許用戶設置終端應該期望的編碼類型。

原來的答覆:嘗試:

print name.string 

print name.string.encode('utf-8') 
+0

已經嘗試沒有幫助。有趣的是,它在python 2.6.5中起作用。並且2.5.2不是..... – Pol 2010-08-13 21:15:45

-1

嘗試

text = text.decode("utf-8", "replace") 
+0

該字符串已被解碼。 – habnabit 2010-08-14 00:44:45

4

你可以試試:

print name.string.encode('ascii', 'replace') 

輸出應該被接受任何的sys.stdout編碼是(包括無)。

實際上,您要打印的文件類對象可能不接受UTF-8。下面是一個例子:如果你有明顯的良性程序

# -*- coding: utf-8 -*- 
print u"hérisson" 

然後在可以打印重音字符終端運行正常工作:

[email protected] /tmp % python2.5 test.py 
hérisson 

但打印連接到一個Unix標準輸出管道不:

[email protected] /tmp % python2.5 test.py | cat 
    Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
print u"hérisson" 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128) 

因爲sys.stdout具有編碼None,在這種情況下:Python中認爲,通過畫中畫讀取程序e應該接收ASCII,並且打印失敗,因爲ASCII不能代表我們想要打印的單詞。類似上面的解決方案解決了這個問題。

注意:您可以檢查標準輸出的編碼具有:

print sys.stdout.encoding 

這可以幫助您調試編碼問題。