J'utilise le code python suivant pour télécharger des pages Web à partir de serveurs avec la compression gzip:Quel est le problème avec ce format gzip?
url = "http://www.v-gn.de/wbb/"
import urllib2
request = urllib2.Request(url)
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
content = response.read()
response.close()
import gzip
from StringIO import StringIO
html = gzip.GzipFile(fileobj=StringIO(content)).read()
Cela fonctionne en général, mais pour l'URL spécifiée échoue avec une exception struct.error
. J'obtiens un résultat similaire si j'utilise wget avec un en-tête "Accept-encoding". Cependant, les navigateurs semblent être capables de décompresser la réponse. Donc ma question est: est-ce que je peux obtenir mon code python pour décompresser la réponse HTTP sans avoir recours à la désactivation de la compression en supprimant l'en-tête "Accept-encoding"?
Pour être complet, voici la ligne que j'utilise pour wget:
wget --user-agent="Mozilla" --header="Accept-Encoding: gzip,deflate" http://www.v-gn.de/wbb/
Cela ne répond pas vraiment à la question initiale, mais est en effet la bonne façon de le faire. Je suis toujours préoccupé par les serveurs défectueux qui retournent un en-tête "Content-encoding: gzip" mais qui envoient les données brutes. – itsadok
L'avez-vous essayé? Cela a fonctionné pour moi. J'ai récupéré une réponse de longueur 151860 qui n'a pas été compressée. Les autres implémentations affichées ici étaient buggées et je ne les ai pas passées en revue. Peut-être un moment plus tard. –
Oui, le site dans la question initiale semble avoir corrigé leur problème, donc je n'ai pas un bon moyen de tester. Dans les deux cas, le problème serait résolu en utilisant 'readline()' au lieu de 'read()', ce qui est fait en dehors de 'retrieve()' de toute façon. – itsadok