Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何解码GZIP编码?_Python_Http_Text_Encoding_Ascii - Fatal编程技术网

在Python中,如何解码GZIP编码?

在Python中,如何解码GZIP编码?,python,http,text,encoding,ascii,Python,Http,Text,Encoding,Ascii,我用python脚本下载了一个网页。 在大多数情况下,这很好 然而,这一个有一个响应头:GZIP编码,当我试图打印这个网页的源代码时,它在我的putty中有所有的符号 如何将其解码为常规文本?使用内置的gzip模块解压缩字节流 如果您有任何问题,请务必显示您使用的确切最小代码、确切的错误消息和回溯,以及打印报告的结果(您的字节流[:100]) 进一步信息 1.有关gzip/zlib/deflate混淆的解释,请阅读本手册的“其他用途”部分 2.如果您使用的是字符串而不是文件,那么使用zlib模块

我用python脚本下载了一个网页。 在大多数情况下,这很好

然而,这一个有一个响应头:GZIP编码,当我试图打印这个网页的源代码时,它在我的putty中有所有的符号


如何将其解码为常规文本?

使用内置的gzip模块解压缩字节流

如果您有任何问题,请务必显示您使用的确切最小代码、确切的错误消息和回溯,以及打印报告的结果(您的字节流[:100])

进一步信息

1.有关gzip/zlib/deflate混淆的解释,请阅读本手册的“其他用途”部分

2.如果您使用的是字符串而不是文件,那么使用zlib模块比使用gzip模块更容易。不幸的是,报告不完整/错误:

解压缩(字符串[,wbits[,bufsize]])

…wbits的绝对值是压缩数据时使用的历史缓冲区大小(“窗口大小”)的两个底对数。对于最新版本的zlib库,它的绝对值应该在8到15之间,较大的值会导致更好的压缩,但会牺牲更大的内存使用率。默认值为15。当wbits为负时,标准gzip头被抑制;这是zlib库的一个未记录的特性,用于与解压的压缩文件格式兼容


首先,我使用zlib从web解压gzip内容

import zlib
import urllib

f=urllib.request.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)

我用的是这样的东西:

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
对于Python 3

试试这个:

import gzip

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

您可以使用urllib3轻松解码gzip

urllib3.response.decode_gzip(response.data)

类似于沙图对蟒蛇3的回答,但安排有点不同:

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())

此方法允许在try/except中包装gzip.decompress(),以捕获并传递操作错误,从而导致压缩数据和未压缩数据混合。如果对一些小字符串进行编码,它们实际上会变大,因此会发送普通数据。

如果使用
请求
模块,则您不需要使用任何其他模块,因为
gzip
deflate
传输编码会为您自动解码

例如:

响应的
.text
属性用于读取文本上下文中的内容

响应的
.content
属性用于读取二进制上下文中的内容


请参阅

部分。此版本非常简单,通过不调用
read()
方法避免了先读取整个文件。它提供了一个类似于文件流的对象,其行为与普通文件流类似

import gzip
from urllib.request import urlopen

my_gzip_url = 'http://my_url.gz'
my_gzip_stream = urlopen(my_gzip_url)
my_stream = gzip.open(my_gzip_stream, 'r')

你能评论一下解压的第二个理由是什么吗?为什么会这样…嗯。。。奇怪吗?@datagrade,第二个参数是窗口大小,请参考下面约翰·梅钦的答案。太棒了!你救了我的命:你可以。注意:早期版本的
GzipFile
使用了
seek()
,但是@SamP我认为因为不能按原样工作,所以不能解释任何事情。我已经让你尝试过了,你肯定会有一些错误。这根本不是一个有效的答案。我喜欢
请求
包,它可以处理
gzip
automatically@SamP只需使用
urllib3.response.gzip解码器()。解压(gzip_数据)
@WeizhongTu当标题中未指定时,您可以发出
请求
处理
gzip
?请注意“开启器”事情是可选的,要解码一个文件,您只需:
data=gzip.decompress(打开(“my.file”,“rb”).read());mystring=str(数据,“utf-8”)
import gzip
from urllib.request import urlopen

my_gzip_url = 'http://my_url.gz'
my_gzip_stream = urlopen(my_gzip_url)
my_stream = gzip.open(my_gzip_stream, 'r')