Por lo tanto, tengo este código para recuperar la cadena JSON de url
url = "http://...."
response = urllib2.urlopen(rul)
string = response.read()
data = json.loads(string)
for x in data:
print x["foo"]
El problema es x["foo"]
, si intento imprimirlo como se ve arriba, me sale este error.
Advertencia: Valor de cadena incorrecto: "xE4xB8xBA Co ..." para la columna "descripción" en la fila 1
Si uso x["foo"].decode("utf-8")
Me sale este error:
UnicodeEncodeError: el codec "ascii" no puede "t" codificar el carácter u "u4e3a" en la posición 0: ordinal no está dentro del rango (128)
Si lo intento encode("ascii", "ignore").decode("ascii")
Entonces me sale este error.
x ["foo"]. encode ("ascii", "ignore"). decode ("ascii") AttributeError: el objeto "NoneType" no tiene ningún atributo "codificar"
Hay alguna manera de arreglar este problema?
Respuestas
2 para la respuesta № 1x["foo"].decode("utf-8")
Resultando en UnicodeEncodeError
significa que x["foo"]
es de tipo unicode
. str.decode
toma una str
tipea y traduce a unicode
tipo. Python 2 intenta ser útil aquí e intenta convertir implícitamente tu unicode
a str
para que puedas llamar decode
en eso. Lo hace con sys.defaultencoding
, cual es ascii
, que no puede codificar todo Unicode, de ahí la excepción.
La solución aquí es eliminar el decode
llamada - el valor ya está unicode
.
Lea la presentación de Ned Batchelder - Unicode Pragmático - mejorará enormemente su comprensión de esto y ayudará a prevenir errores similares en el futuro.
Vale la pena señalar aquí que todo devuelto por json.load
estarán unicode
y no str
.
Abordar la nueva pregunta después de las ediciones:
Cuando tú print
, necesitas bytes - Unicode es un concepto abstracto. Necesita una asignación de la cadena abstracta de Unicode a bytes. En términos de Python, debe convertir su unicode
oponerse a str
. Puedes hacer esto llamando encode
con una codificación que le dice cómo traducir de la cadena abstracta a bytes concretos. Generalmente quieres usar la codificación utf-8.
Esto debería funcionar:
print x["foo"].encode("utf-8")