72 votes

Est-ce que python urllib2 décompresse automatiquement les données gzip extraites de la page Web?

j'utilise

  data=urllib2.urlopen(url).read()
 

Je veux savoir:

  1. Comment puis-je savoir si les données d'une URL sont gzippées?

  2. Est-ce que urllib2 décompresse automatiquement les données si elles sont gzippées? Les données seront-elles toujours une chaîne?

149voto

ars Points 35803

Ceci vérifie si le contenu est compressé et le décompresse:

 from StringIO import StringIO
import gzip

request = urllib2.Request('http://example.com/')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO( response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
 

8voto

bobince Points 270740

Si vous parlez d'un simple .gz le fichier, non, urllib2 ne sera pas le décoder, vous obtiendrez la inchangée .gz le fichier de sortie.

Si vous parlez HTTP automatique-niveau de compression à l'aide de Content-Encoding: gzip ou deflate, alors que doit être délibérément demandé par le client à l'aide d'un Accept-Encoding - tête.

urllib2 ne pas mettre cet en-tête, afin que la réponse qu'il obtient en retour ne seront pas compressés. Vous pouvez aller chercher la ressource sans avoir à vous soucier de compression (bien que depuis de compression n'est pas soutenu la demande peut prendre plus de temps).

5voto

RuiDC Points 778

On a répondu à votre question, mais pour une implémentation plus complète, jetez un coup d'œil à l'implémentation de Mark Pilgrim , elle couvre gzip, déflate, l'analyse des URL sécurisée et bien plus encore, pour un analyseur syntaxique RSS largement utilisé, mais néanmoins utile. référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X