2009-10-29 26 views
10

Estoy programando en Python y estoy obteniendo información de una página web a través de la biblioteca urllib2. El problema es que esa página me puede proporcionar caracteres no ASCII, como 'ñ', 'á', etc. En el mismo momento urllib2 obtiene este personaje, que provoca una excepción, como este:Cómo manejar caracteres Unicode (no 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) 

necesito para manejar esos personajes Quiero decir, no quiero manejar la excepción sino continuar el programa. ¿Hay alguna manera de, por ejemplo (no sé si esto es algo estúpido), usar otro codec en lugar del ASCII? Como tengo que trabajar con esos caracteres, insértelos en una base de datos, etc.

+0

Sería útil si también pudieras decir si estás usando Python 3+ o algo más temprano. –

+0

No podría ser Py3k dado que el módulo urllib2 se ha eliminado (incluido en urllib) ... –

+0

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

Respuesta

9

Acaba de leer un conjunto de bytes del socket. Si quieres una cadena que tiene que descifrar:

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

(sustituyendo cualquier codificación que está utilizando para utf-8)

Entonces usted tiene que hacer a la inversa que devolverlo a cabo:

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

Si desea, puede usar Unicode para todo su trabajo.

Es probable que encuentre esta pregunta/respuesta útil:

urllib2 read to Unicode

0

Es posible que desee ver en el uso de una biblioteca de análisis real de encontrar esta información. lxml, por ejemplo, ya se ocupa de la codificación/decodificación Unicode usando el juego de caracteres declarado.

+0

Desafortunadamente, muchos sitios web producen documentos codificados incorrectamente, generalmente la codificación será en su mayoría correcta, pero habrá secuencias esporádicas de bytes inválidos. Algunas aplicaciones no tendrán que preocuparse por esto, pero si está rastreando sitios web públicos aleatorios, será un problema. – mikerobi

Cuestiones relacionadas