2009-01-20 6 views
4

Avec BeautifulSoup 3.1.0.1 et Python 2.5.2, et en essayant d'analyser une page Web en français. Cependant, dès que je l'appelle findAll, je reçois l'erreur suivante:UnicodeEncodeError avec BeautifulSoup 3.1.0.1 et Python 2.5.2

UnicodeEncodeError: codec 'ascii' ne peut pas encoder le caractère u '\ XE9' en position 1146: ordinal dans la plage (128)

Ci-dessous le code que je suis actuellement en cours d'exécution:

import urllib2 
from BeautifulSoup import BeautifulSoup 
page = urllib2.urlopen("http://fr.encarta.msn.com/encyclopedia_761561798/Paris.html") 
soup = BeautifulSoup(page, fromEncoding="latin1") 
r = soup.findAll("table") 
print r 

est-ce que quelqu'un a une idée pourquoi?

Merci!

MISE À JOUR: Comme resquested, ci-dessous est le retraçage complet

Traceback (most recent call last): 
    File "[...]\test.py", line 6, in <module> 
    print r 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1146-1147: ordinal not in range(128) 

Répondre

11

Voici une autre idée. Votre terminal n'est pas capable d'afficher une chaîne Unicode à partir de Python. L'interpréteur essaie de le convertir en ASCII en premier. Vous devriez l'encoder explicitement avant d'imprimer. Je ne connais pas la sémantique exacte de soup.findAll(). Mais il est probablement quelque chose comme:

for t in soup.findAll("table"): 
    print t.encode('latin1') 

Si t est vraiment une chaîne. Peut-être que c'est juste un autre objet à partir duquel vous devez construire les données que vous souhaitez afficher.

+1

Cela fonctionne! : D Mais qu'entendez-vous par "Votre terminal n'est pas capable d'afficher une chaîne Unicode à partir de Python.". J'exécute mon script dans IDLE (Python Shell). Cela devrait fonctionner, n'est-ce pas? – Martin

+0

Un terminal doit indiquer à l'interpréteur Python quel jeu de caractères il utilise. Habituellement, cela est fait à travers une variable d'environnement. Je ne sais pas comment cela est géré par IDLE. –

+1

impression repr (t) est également utile. C'est généralement une bonne idée de repr() que vous produisez pour le débogage afin que vous puissiez voir exactement le type et les caractères de contrôle ou les bits de contrôle qui s'y trouvent, ainsi que de ne pas ajouter de fausses exceptions à votre code de débogage . – bobince

Questions connexes