2010-08-13 8 views
0

Dans ce code:Problème avec le codage de décodage. Python. Django. BeautifulSoup

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

erreur qui se passe quand je suis en train d'imprimer ou de sauvegarder la base de données.

dosnt Metter ce que je fais:

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

ou tout simplement

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) 

Ceci est repr (name.string)

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

+0

Veuillez écrire la sortie de 'print (repr (nom.string))', et 'print (sys.stdout.encoding)'. – unutbu

Répondre

5

Je ne sais pas ce que vous essayez de faire avec name.string.decode('utf-8').Comme la documentation BeautifulSoup eloquently points out, "BeautifulSoup vous donne Unicode, dammit". Donc, name.string est déjà décodé - il est en Unicode. Vous pouvez encoder retour à utf-8 si vous le souhaitez, mais vous ne pouvez pas le décoder plus loin.

0

Édition: name.string vient de BeautifulSoup, donc il est probablement déjà une chaîne unicode.

Cependant, votre message d'erreur mentionne « ascii »:

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

Selon le PrintFails Python wiki page, si Python ne sait pas ou ne peut pas déterminer quel type de codage périphérique de sortie attend, il définit sys .stdout.encoding à None et print tente de coder ses arguments avec le codec 'ascii'.

Je crois que c'est la cause de votre problème. Vous pouvez le confirmer en voyant si print sys.stdout.encoding imprime None. Selon la même page, liée ci-dessus, vous pouvez contourner le problème par en indiquant explicitement à Python quel encodage utiliser. Vous ne terminerons que sys.stdout dans une instance de StreamWriter:

Par exemple, vous pourriez essayer d'ajouter

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

à votre script avant l'instruction print. Vous devrez peut-être modifier locale.getpreferredencoding() et coder explicitement (par exemple 'utf-8', 'cp1252', etc.). Le bon codage à utiliser dépend de votre périphérique de sortie. Il doit être défini en fonction de l'encodage attendu par votre périphérique de sortie. Si est en cours de sortie vers un terminal, le terminal peut avoir un paramètre de menu pour autoriser à définir le type de codage que le terminal doit attendre.

réponse originale: Essayez:

print name.string 

ou

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

Déjà essayé de ne pas aider. La chose intéressante est que dans Python 2.6.5 cela fonctionne. Et 2.5.2 pas ..... – Pol

-1

essayer

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

La chaîne est déjà décodée. – habnabit

4

Vous pouvez essayer:

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

La sortie doit être acceptée quel que soit le codage de sys.stdout est (y compris None). En fait, l'objet de type fichier sur lequel vous imprimez peut ne pas accepter le format UTF-8. Voici un exemple: si vous avez le programme

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

apparemment bénigne, puis l'exécuter dans un terminal qui permet d'imprimer des caractères accentués fonctionne très bien:

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

mais l'impression à une sortie standard connecté à un Unix tuyau ne fonctionne pas:

[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) 

parce sys.stdout a le codage None, dans ce cas: Python considère que le programme qui se lit à travers le pip e devrait recevoir ASCII, et l'impression échoue parce que ASCII ne peut pas représenter le mot que nous voulons imprimer. Une solution comme celle ci-dessus résout le problème.

Remarque: Vous pouvez vérifier l'encodage de votre sortie standard avec:

print sys.stdout.encoding 

Cela peut vous aider à résoudre les problèmes codant.