使用zlib解压Python请求响应

3

我正在尝试使用Python requests和zlib解压缩Web请求的响应,但是我无法正确地解压缩响应内容。这是我的代码:

import requests
import zlib

URL = "http://" #omitted real url
r = requests.get(URL)
print r.content
data = zlib.decompress(r.content, lib.MAX_WBITS)
print data

然而,当我更改wbits参数时,经常会出现各种错误。

zlib.error: Error -3 while decompressing data: incorrect header check
zlib.error: Error -3 while decompressing data: invalid stored block lengths

我尝试了针对deflate、zlip和gzip的wbits参数,就像这里zlib.error: Error -3 while decompressing: incorrect header check所述。

但仍然无法解决这些错误。我正在Python中尝试这个,我被给予了这段用Objective-C完成的代码,但我不懂Objective-C。

#import "GTMNSData+zlib.h"
+ (NSData*) uncompress: (NSData*) data
{
    Byte *bytes= (Byte*)[data bytes];
    NSInteger length=[data length];
    NSMutableData* retdata=[[NSMutableData alloc]   initWithCapacity:length*3.5];

    NSInteger bSize=0;
    NSInteger offSet=0;
    while (true) {
        offSet+=bSize;
        if (offSet>=length) {
            break;
        }
        bSize=bytes[offSet];
        bSize+=(bytes[offSet+1]<<8);
        bSize+=(bytes[offSet+2]<<16);
        bSize+=(bytes[offSet+3]<<24);
        offSet+=4;
        if ((bSize==0)||(bSize+offSet>length)) {
            LogError(@"Invalid");
            return data;
        }
        [retdata appendData:[NSData gtm_dataByInflatingBytes: bytes+offSet length:bSize]];
    }
    return retdata; 
}

这些内容不是单个的zlib流,而是一系列带有4字节小端长度前缀的流。我可能可以编写一个解码器。 - Dan D.
我也遇到了同样的问题,想知道你是否找到了解决方案... - Felipe
2个回答

1
根据Python请求文档,位于: 它说:

它说:

You can also access the response body as bytes, for non-text requests:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

The gzip and deflate transfer-encodings are automatically decoded for you.

如果请求理解编码,则应该已经解压缩。如果需要访问原始数据以处理不同的解压缩机制,请使用 r.raw。

0
以下是未经测试的Objective-C代码翻译:
import zlib
import struct

def uncompress(data):
    length = len(data)
    ret = []
    bSize = 0
    offSet = 0
    while True:
        offSet += bSize
        if offSet >= length:
            break

        bSize = struct.unpack("<i", data[offSet:offSet+4])
        offSet += 4
        if bSize == 0 or bSize + offSet > length:
           print "Invalid"
           return ''.join(ret)
        ret.append(zlib.decompress(data[offSet:offSet+bSize]))

   return ''.join(ret)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接