2009-10-29 9 views
10

Je programmation en Python et j'obtenir des informations à partir d'une page Web dans la bibliothèque urllib2. Le problème est que cette page peut me fournir des caractères non-ASCII, comme 'ñ', 'á', etc. Dans le moment urllib2 obtient ce personnage, il provoque une exception, comme ceci:Comment gérer les caractères Unicode (non-ASCII) en Python?

File "c:\Python25\lib\httplib.py", line 711, in send 
    self.sock.sendall(str) 
File "<string>", line 1, in sendall: 
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 74: ordinal not in range(128) 

J'ai besoin de gérer ces caractères. Je veux dire, je ne veux pas gérer l'exception mais continuer le programme. Y at-il un moyen de, par exemple (je ne sais pas si c'est quelque chose de stupide), utiliser un autre codec plutôt que l'ASCII? Parce que je dois travailler avec ces personnages, les insérer dans une base de données, etc.

+0

Il serait utile que vous pourriez dire, aussi, si vous utilisez Python 3+, ou quelque chose plus tôt. –

+0

n'a pas pu être Py3K depuis le module urllib2 a été supprimé (enveloppé dans urllib) ... –

+0

double: http://stackoverflow.com/questions/1020892/python-urllib2-read-to-unicode –

Répondre

9

Vous venez de lire un ensemble d'octets de la prise. Si vous voulez une chaîne que vous devez le décoder:

yourstring = receivedbytes.decode("utf-8") 

(en remplaçant l'encodage choisi que vous utilisez pour utf-8)

Ensuite, vous devez faire l'inverse pour le renvoyer à:

outbytes = yourstring.encode("utf-8") 
6

Vous voulez utiliser unicode pour votre travail si vous le pouvez.

Vous trouverez probablement cette question/réponse utile:

urllib2 read to Unicode

0

Vous pouvez regarder dans une bibliothèque d'analyse réelle pour trouver ces informations. lxml, par exemple, adresse déjà Unicode encoder/décoder en utilisant le jeu de caractères déclaré.

+0

Malheureusement, beaucoup de site Web produire des documents codés de manière incorrecte, généralement le codage sera la plupart du temps correct, mais il y aura des séquences d'octets non valides sporadiques. Certaines applications n'auront pas à s'inquiéter à ce sujet, mais si vous explorez des sites Web publics aléatoires, ce sera un problème. – mikerobi

Questions connexes