2012-07-11 26 views
20

I am using the requests library to query the Diffbot API to get contents of an article from a web page url. When I visit a request URL that I create in my browser, it returns a JSON object with the text in Unicode (right?) for example (I shortended the text somewhat):Python Requests and Unicode

{"icon":"http://mexico.cnn.com/images/ico_mobile.jpg","text":"CIUDAD DE MÉXICO (CNNMéxico) \u2014 Kassandra Guazo Cano tiene 32 años, pero este domingo participó por primera vez en una elección.\n\"No había sacado mi (credencial del) IFE (Instituto Federal Electoral) porque al hacer el trámite hay mucha mofa cuando ven que tu nombre no coincide con tu y otros documentos de acuerdo con su nueva identidad.\nSánchez dice que los solicitantes no son discriminados, pero la experiencia de Kassanda es diferente: \"hay que pagar un licenciado, dos peritos (entre ellos un endocrinólogo). Además, el juez dicta sentencia para el cambio de nombre y si no es favorable tienes que esperar otros cuatro años para volver a demandar al registro civil\".\nAnte esta situación, el Consejo para Prevenir y Eliminar la sculina, los transgénero votan - México: Voto 2012 - Nacional","url":"http://mexico.cnn.com/nacional/2012/07/02/con-apariencia-de-mujer-e-identidad-masculina-los-transexuales-votan","xpath":"/HTML[1]/BODY[1]/SECTION[5]/DIV[1]/ARTICLE[1]/DIV[1]/DIV[6]"}

When I use the python request library as follows:

def get_article(self, params={}): 
    api_endpoint = 'http://www.diffbot.com/api/article' 
    params.update({ 
    'token': self.dev_token, 
    'format': self.output_format, 
    }) 
    req = requests.get(api_endpoint, params=params) 
    return json.loads(req.content) 

It returns this (again note that I shortened the text somewhat):

{u'url': u'http://mexico.cnn.com/nacional/2012/07/02/con-apariencia-de-mujer-e-identidad-masculina-los-transexuales-votan', u'text': u'CIUDAD DE M\xc9XICO (CNNM\xe9xico) \u2014 Kassandra Guazo Cano tiene 32 a\xf1os, pero este domingo particip\xf3 por primera vez en una elecci\xf3n.\n"No hab\xeda sacado mi (credencial del) IFE (Instituto Federal Electoral) porque al hacOyuky Mart\xednez Col\xedn, tambi\xe9n transg\xe9nero, y que estaba acompa\xf1ada de sus dos hijos y su mam\xe1.\nAmbas trabajan como activistas en el Centro de Apoyo a las Identidades Trans, A.C., donde participan en una campa\xf1a de prevenci\xf3n de enfermedades sexuales.\n"Quisi\xe9ramos que no solo nos vean como trabajadoras sexuales o estilistas, sino que luchamos por nuestros derechos", dice Kassandra mientras sonr\xede, sostiene su credencial de elector y levanta su pulgar entintado.', u'title': u'Con apariencia de mujer e identidad masculina, los transg\xe9nero votan - M\xe9xico: Voto 2012 - Nacional', u'xpath': u'/HTML[1]/BODY[1]/SECTION[5]/DIV[1]/ARTICLE[1]/DIV[1]/DIV[6]', u'icon': u'http://mexico.cnn.com/images/ico_mobile.jpg'}

I don't quite understand Unicode. How to make sure that what I get with requests is still Unicode?

+0

Parece que tienes cadenas Unicode en ese resultado JSON. Observe la notación "u '...'"? También puede verificar el tipo de alguno de los resultados: 'tipo (resultado ['texto'])'. http://docs.python.org/howto/unicode.html – istruble

+0

¡Gracias! Veo que es unicode de hecho con el u '', sin embargo, dice prevenci \ xf3n (cuando se usan solicitudes) en lugar de preferiría (en el navegador), por ejemplo. ¿Cómo puedo hacer que ese prevenci \ xf3n sea preferiría? – Javaaaa

+1

Eso es simplemente una sintaxis literal de cadena antigua. Python te muestra '\ xc9' porque es seguro imprimir en todas las consolas, mientras que' É' fallaría en las consolas que no son compatibles con Unicode correctamente. Si su consola está funcionando, puede ver que son lo mismo. '>>> u'CIUDAD DE M \ xc9XICO '== u'CIUDAD DE MÉXICO'' es verdadero. – bobince

Respuesta

34

Puede usar req.text en lugar de req.content para asegurarse de obtener Unicode. Los métodos se describen en:

http://docs.python-requests.org/en/latest/api/#main-interface

+2

¿hay alguna manera de no obtener una respuesta JSON unicode con las solicitudes? Parece que la única forma de imprimir una respuesta JSON al terminal sin el Unicode es imprimir el JSON como una cadena, pero luego, por supuesto, ya no es una estructura de datos, solo una cadena. ¿Hay alguna forma de tratar las respuestas de solicitud como JSON "puro" aún como una estructura de datos pero sin Unicode? – AdjunctProfessorFalcon

+2

NB: en algunos casos, es necesario hacer 'response.content.decode ('utf-8')' para convertir los bytes sin formato a UTF-8. –

11

Concerning the "I don't quite understand unicode", there's an entertaining primer on Unicode by Joel Spolsky and the official Python Unicode HowTo which is a 10 minute read and covers everything Python specific.

El requests docs dicen que la solicitud siempre devolverá Unicode, y el contenido ejemplo informados es, de hecho, Unicode (nótese la sintaxis u'' cuerda? Esa es la sintaxis de Python para cadenas Unicode.), Así que no hay problema. Tenga en cuenta que si ve la respuesta JSON en un navegador web, el u'' no estará allí porque es una propiedad de cómo Python almacena una cadena.

Si unicode es importante para su aplicación, por favor no intente hacer frente sin realmente saber acerca de Unicode. Te espera un mundo de dolor, los problemas de conjunto de caracteres son extremadamente frustrantes para depurar si no sabes lo que estás haciendo. Leer los dos artículos mencionados anteriormente puede demorar media hora.

+1

Agregue a esos enlaces la excelente presentación de Ned Batchelder sobre Unicode pragmático en Python: http://nedbatchelder.com/text/unipain.html – bgporter

+0

¡Gracias! Veo que es unicode de hecho con el u '', sin embargo, dice prevenci \ xf3n (cuando se usan solicitudes) en lugar de preferiría (en el navegador), por ejemplo. ¿Cómo puedo hacer que ese prevenci \ xf3n sea preferiría? – Javaaaa

+0

Python usa una secuencia de escape como '\ xf3' para cada carácter no ASCII cuando * muestra * una cadena Unicode. Mirando los gráficos Unicode en http://www.unicode.org/charts/, verás que es un "ó", así que está bien. Si desea ver el personaje real, deberá codificar la cadena Unicode. – Simon