[pyar] URL Encoding

Matías Bellone matiasbellone en gmail.com
Dom Ene 23 18:42:55 ART 2011


2011/1/23 matias benedetto <matias.benedetto en gmail.com>:
> Hola, estoy teniendo un prolema con los caracteres de una url pero no se
> bien en que punto me estoy equivocando.
>
> Lo que estoy haciendo es leer unos textos de un sitio web que tiene un Head
> Html Charset de iso-8859-1.
> Lo que yo hice en mi script es leerlo y guardarlo en una BD mysql en utf-8.
> Para esto hago:
>
> #decodifico
> autor = autor.decode("iso-8859-1") #tambien probe utf-8 acá
> #codifico para guardarlo en la BD
> autor = autor.encode("utf-8")
>
> Hasta ahi creo que va todo bien, pero en otro script leo estos mismo datos
> desde la BD.
> Tengo que  convertir el registro leido en una URL, lo hago asi.
>
> autor=urllib.quote(autor, ":/")
>
> el problema es que cuando hay caracteres especiales como los acentos la url
> no se forma correctamente un ejemplo:
>
> autor=Abreu Orta,Joaquín
> print urllib.quote(autor, ":/")
> # Devuelve: Abreu+Orta%2CJoaqu%C3%ADn
> # Cuando tendria que devolver: Abreu+Orta%2CJoaqu%EDn
> #(esta cadena si encuentra la pagina cuando la pongo en el navegador)
>

En realidad está pasando lo que vos le decís que pase. Mirá el
siguiente ejemplo:

>>> 'á-é-í-ó-ú'.decode("iso-8859-1")
u'\xc3\xa1-\xc3\xa9-\xc3\xad-\xc3\xb3-\xc3\xba'
>>> 'á-é-í-ó-ú'.decode("iso-8859-1").encode('utf-8')
'\xc3\x83\xc2\xa1-\xc3\x83\xc2\xa9-\xc3\x83\xc2\xad-\xc3\x83\xc2\xb3-\xc3\x83\xc2\xba'
>>> urllib.quote('á-é-í-ó-ú'.decode("iso-8859-1").encode('utf-8'), ':/')
'%C3%83%C2%A1-%C3%83%C2%A9-%C3%83%C2%AD-%C3%83%C2%B3-%C3%83%C2%BA'

Si te fijás, vos estás agarrando una cadena de bytes, decodificándola
como iso-8859-1 y después encodeándola como utf-8. Y urllib.quote hace
lo suyo sobre lo que vos le estás pasando.

Tu problema es que lo que le estás pasando no es lo mismo con lo que
empezaste. Para volver a lo que empezaste tenés que hacer el proceso
inverso: decodificarla como utf-8 y encodearla como iso-8859-1:

>>> 'á-é-í-ó-ú'.decode("iso-8859-1").encode('utf-8').decode('utf-8').encode('iso-8859-1')
'\xc3\xa1-\xc3\xa9-\xc3\xad-\xc3\xb3-\xc3\xba'

Aunque no parece ser lo que estás buscando tampoco. Jugando un poco
más, parece ser que el problema es que estás haciendo algo mal desde
el vamos:

>>> 'á-é-í-ó-ú'.decode("utf-8")
u'\xe1-\xe9-\xed-\xf3-\xfa'

Que sí es lo que querés.

Así que o bien no estoy pudiendo duplicar tu escenario exactamente
desde mi terminal (que no sería raro), o bien la página que te dice
estar entregando iso-8859-1 en realidad te está escupiendo utf-8 o
algo lo está convirtiendo en el medio o al menos te ayudé a empezar a
encontrar la solución (o ninguna de las anteriores :P)

Saludos,
Toote
--
http://enespanol.com.ar/



More information about the pyar mailing list