2012-07-21 13 views
5

He tenido problemas con las codificaciones durante demasiado tiempo, y hoy quiero romper el bloque mental de par en par.Cómo manejar codificaciones usando la biblioteca Python Requests

En este momento, estoy usando Requests para raspar un montón de sitios web, y de lo que puedo decir es usando los encabezados HTTP para descubrir las codificaciones que están usando las páginas, volviendo al chardet cuando los encabezados del sitio están perdidos. A partir de ahí, decodifica el bytecode que descarga, y luego me entrega amablemente un objeto Unicode en r.text.

Todo bien.

Pero dónde estoy confundido es que a partir de ahí que hago un trabajo sobre el texto y luego imprimirlo en la salida estándar, proporcionando una codificación al imprimir:

print foo.encode('utf-8') 

El problema es que cuando lo haga eso, lo que está impreso está en mal estado. En lo que sigue, espero obtener una emdash entre la palabra 'juicios' y 'estándar':

Declaratory judgmentsStandard of review. 

En cambio, me sale la cosa en forma de caja con los cuatro números pequeños en el mismo. No parece a aparecer aquí, por supuesto, pero creo que los números son 0097, que corresponde a lo que me pasa si hago:

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

Así que ese tipo de tiene sentido, pero ¿dónde está mi emdash?

El proceso se reduce a:

  1. solicitudes descarga una página y de forma inteligente decodifica el texto a un objeto Unicode
  2. que trabajar con él
  3. que codificar a UTF-8 e imprimir fuera.

¿Dónde está el problema? Esto me suena como el mythical unicode sandwich, pero claramente me falta algo.

Respuesta

4

Estás haciendo algo extraño. \x97 es un emdash en la codificación cp1252. En una cadena Unicode, es U+0097 END OF GUARDED AREA. De alguna manera, estás leyendo cp1252 bytes como Unicode. Muestra más del código que te llevó a este estado, y podemos profundizar más.

PD: el sándwich Unicode no es mítico, ¡es un ideal para luchar! :)

+0

Yup! Lo lograste. La [página] (http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669) es el problema. No declara una codificación por lo que chardet lo reconoce como 'ISO-8859-1', y las Solicitudes lo decodifican como tal. Luego, cuando lo codifico como utf-8, por supuesto que también falla. ¿Cómo supiste esto de la parte superior de tu cabeza? Quiero evitar esto en el futuro? – mlissner

+0

Ah, y otra pregunta ... Firefox y Chrome también detectan esta página como iso-8859-1 ... ¡pero muestran los emdahes perfectamente! ¿Cuál es su truco? – mlissner

+0

La larga experiencia me dice que los caracteres como emdash codificados en \ x9X probablemente sean cp1252. Al buscarlo en Wikipedia confirmó que cp1252 mapea el byte que le mostró al personaje que esperaba. cp1252 es en realidad un superconjunto de iso8859-1, con caracteres imprimibles donde iso8859-1 no tiene ninguno. Entonces, cuando los navegadores dicen que están usando 8859-1, en realidad usan cp1252 porque, por qué no, simplemente hace que más caracteres se puedan imprimir. –

Cuestiones relacionadas