用zlib解压Python请求响应

2024-07-05 10:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用pythonrequests和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参数时,我不断地遇到各种错误。在

^{pr2}$

我尝试了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; 
}

Tags: 代码importurldatabytescontentrequestslength
2条回答

根据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。在

以下是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)

相关问题 更多 >