Сжатие содержимого URL-адреса — Python

Я вернулся. :) Снова пытаемся получить gzip-содержимое URL-адреса и заархивировать его. На этот раз на Питоне. Раздел кода #SERVER — это сценарий, который я использую для создания сжатых данных. Данные хорошо известны, так как они работают с Java. Раздел кода #CLIENT — это фрагмент кода, который я использую на стороне клиента, чтобы попытаться прочитать эти данные (для возможного разбора JSON). Однако где-то в этой передаче модуль gzip забывает, как читать созданные им данные.

#SERVER
outbuf = StringIO.StringIO()
outfile = gzip.GzipFile(fileobj = outbuf, mode = 'wb')
outfile.write(data)
outfile.close()
print "Content-Encoding: gzip\n"
print outbuf.getvalue()

#CLIENT
urlReq = urllib2.Request(url)
urlReq.add_header('Accept-Encoding', '*')
urlConn = urllib2.build_opener().open(urlReq)
urlConnObj = StringIO.StringIO(urlConn.read())
gzin = gzip.GzipFile(fileobj = urlConnObj)
return gzin.read() #IOError: Not a gzipped file.

Другие примечания:

outbuf.getvalue() совпадает с urlConnObj.getvalue() совпадает с urlConn.read()


person Patrick Perini    schedule 19.07.2011    source источник


Ответы (1)


Этот вопрос StackOverflow, похоже, помог мне.

По-видимому, было просто разумно полностью обойти модуль gzip, выбрав вместо него zlib. Также может помочь изменение «*» на «gzip» в заголовке «Accept-Encoding».

#CLIENT
urlReq = urllib2.Request(url)
urlReq.add_header('Accept-Encoding', 'gzip')
urlConn = urllib2.urlopen(urlReq)
return zlib.decompress(urlConn.read(), 16+zlib.MAX_WBITS)
person Patrick Perini    schedule 19.07.2011