He descargado de una página web en mi secuencia de comandos de python.
En la mayoría de los casos, esto funciona bien.

Sin embargo, este tenía un encabezado de respuesta: la codificación GZIP, y cuando traté de imprimir el código fuente de esta página web, tenía todos los símbolos en mi masilla.

¿Cómo interpretar este texto normal?

InformationsquelleAutor TIMEX | 2010-04-22

7 Comentarios

  1. 79

    Yo uso zlib para descomprimir gzip contenido de la web.

    import zlib
    
    ...
    # f=urllib2.urlopen(url) 
    decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
    • guardar mi vida )
    • comente, por favor, lo que el segundo argumento para descomprimir es para? Y ¿por qué es tan…bien… ¿extraño?
    • El segundo argumento es para el tamaño de la ventana, por favor refiérase a Juan Machin la Respuesta a continuación.
    • Impresionante! Usted salvó mi vida 😀
    • usted puede usar GzipFile para descomprimir on-the-fly. Nota: las versiones anteriores de GzipFilehe utilizado seek() pero se fija ahora.
    • Gracias ! a mí me funcionó!

  2. 30

    Descomprimir el flujo de bytes con la incorporada en el gzip módulo.

    Si usted tiene cualquier problema, muestra el código mínimo que usted utiliza, el mensaje de error exacto y trazabilidad, junto con el resultado de print repr(your_byte_stream[:100])

    Más información

    1. Para una explicación de la gzip/zlib/desinflar la confusión, leer los «Otros usos» de la sección de este artículo de la Wikipedia.

    2. Puede ser más fácil utilizar el zlib módulo de la gzip módulo si usted tiene una cadena en lugar de un archivo. Por desgracia, la Python docs está incompleta o es errónea:

    zlib.descomprimir(string[, wbits[, bufsize]])

    …El valor absoluto de wbits es la base de dos logaritmo del tamaño del búfer de historial (el «tamaño de la ventana») se utiliza cuando la compresión de los datos. Su valor absoluto debe ser de entre 8 y 15 para las versiones más recientes de la biblioteca zlib, los valores más grandes que resulta en una mejor compresión a expensas de un mayor uso de memoria. El valor predeterminado es 15. Cuando wbits es negativo, el estándar de compresión de encabezado es suprimida; este es un indocumentado función de la biblioteca zlib, utiliza para la compatibilidad con descomprimir compresión del formato de archivo.

    En primer lugar, 8 <= log2_window_size <= 15, con el significado dado anteriormente. Entonces, ¿qué debe ser separado de arg es kludged en la parte superior:

    arg == log2_window_size significa asumir cadena en el formato zlib (RFC 1950; lo que el HTTP 1.1 RFC 2616 confusamente llamadas «desinflar»).

    arg == -log2_window_size significa asumir cadena está en formato deflate (RFC 1951; lo que la gente que no leyó el HTTP 1.1 RFC cuidadosamente implementada en la realidad)

    arg == 16 + log_2_window_size significa asumir cadena está en formato gzip (RFC 1952). Así que usted puede utilizar 31.

    La información anterior está documentado en el zlib biblioteca C manual de … Ctrl-F de búsqueda para windowBits.

    • Gracias por la información exhaustiva sobre el tema.
  3. 11

    Puedo usar algo como que:

    f = urllib2.urlopen(request)
    data = f.read()
    try:
        from cStringIO import StringIO
        from gzip import GzipFile
        data2 = GzipFile('', 'r', 0, StringIO(data)).read()
        data = data2
    except:
        #print "decompress error %s" % err
        pass
    return data
  4. 8

    Para Python 3

    Probar esto:

    import gzip
    
    fetch = opener.open(request) # basically get a response object
    data = gzip.decompress(fetch.read())
    data = str(data,'utf-8')
  5. 2

    Similar a Shatu la respuesta para python3, pero dispuestos de manera un poco diferente:

    import gzip
    
    s = Request("https://someplace.com", None, headers)
    r = urlopen(s, None, 180).read()
    try: r = gzip.decompress(r)
    except OSError: pass
    result = json_load(r.decode())

    Este método permite envolver el gzip.descomprimir() en un try/except para capturar y pasar el OSError que los resultados en situaciones en las que puede mezclarse con y sin compresión de datos. Algunas pequeñas cadenas, en realidad se hacen más grandes si están codificados, por lo que la llanura que se envían los datos en su lugar.

  6. 1

    Si utiliza el Requests módulo, a continuación, no utilizar otros módulos porque el gzip y deflate de la transferencia de codificaciones son automáticamente decodificada para usted.

    Ejemplo:

    >>> import requests
    >>> custom_header = {'Accept-Encoding': 'gzip'}
    >>> response = requests.get('https://api.github.com/events', headers=custom_header)
    >>> response.headers
    {'Content-Encoding': 'gzip',...}
    >>> response.text
    '[{"id":"9134429130","type":"IssuesEvent","actor":{"id":3287933,...

    La .text propiedad de la respuesta es para leer el contenido en el texto contexto.

    La .content propiedad de la respuesta es para leer el contenido en el binario contexto.

    Ver el Respuesta Binaria Contenido sección en docs.python-requests.org

  7. -1

    Puede utilizar urllib3 fácilmente decodificar gzip.

    urllib3.response.decode_gzip(response.data)
    • ¿Por qué ha sido votada abajo?
    • Creo que ya no funciona como es, no explica nada. He de intentarlo u obtendrá unos errores de seguro. Eso no es una respuesta válida a todos.
    • Me gusta requests paquete, que podría manejar gzip automáticamente
    • sólo uso urllib3.response.GzipDecoder().decompress(gzip_data)
    • se puede hacer requests manejar gzip cuando no esté especificado en los encabezados ?

Dejar respuesta

Please enter your comment!
Please enter your name here