2016-11-23 4 views
0

Я пытаюсь выполнить распаковку ответа из веб-запроса с использованием запросов Python и zlib, но я не могу правильно разложить содержимое ответа. Вот мой код:Декомпрессия Ответ на запрос Python с zlib

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 

Я попытался параметры wbits для выкачать, ZLIP и Gzip, как отмечено здесь 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; 
} 
+0

Содержимое не один поток Zlib а ряд из них каждый с префиксом 4 байт немного endian длина. Возможно, я мог бы написать декодер. –

ответ

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. 

Если REQ uests понимают кодировку, поэтому он должен быть несжатым.

Используйте 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)