2016-11-23 3 views
0

Ich versuche, die Antwort von einer Web-Anfrage mit Python-Anfragen und zlib zu dekomprimieren, aber ich bin nicht in der Lage, den Inhalt der Antwort richtig dekomprimieren. Hier ist mein Code:Decompress Python Anfragen Antwort mit 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 

Allerdings halte ich verschiedene Fehler bekommen, wenn die wbits Parameter ändern.

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

Ich versuchte, die wbits Parameter für deflate, ZLIP und gzip wie hier bemerkt zlib.error: Error -3 while decompressing: incorrect header check

aber immer noch nicht, diese Fehler passieren lassen. Ich bin dazu in Python versucht, war ich dieses Stück Code gegeben, dass es mit Objective-C hat, aber ich weiß nicht, 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

Die Inhalte sind kein einziger zlib Strom, sondern eine Reihe von ihnen jeweils mit einem Präfix 4 Byte kleine Endianlänge. Ich könnte wahrscheinlich einen Decoder schreiben. –

Antwort

1

Nach Python fordert Dokumentation:

heißt es:

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. 

Wenn erf Sie verstehen die Codierung, sie sollte daher bereits unkomprimiert sein.

Verwenden Sie r.raw, wenn Sie Zugriff auf die ursprünglichen Daten benötigen, um einen anderen Dekomprimierungsmechanismus zu verarbeiten.

0

Das Folgende ist eine nicht geprüfte Übersetzung des Objective-C-Code:

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)