2012-02-23 19 views

risposta

3

usare sia urllib2.urlopen, o si potrebbe provare a utilizzare l'ottimo modulo Requests ed evitare urllib2 mal di testa:

import requests 
results = requests.get('url') 
#pass results.content onto secondary processing... 
+0

Ma come si analizza results.content int a zip? – 0atman

+0

Usa il modulo 'zipfile': ' zip = zipfile.ZipFile (results.content) '. Quindi basta analizzare i file usando 'ZipFile.namelist()', 'ZipFile.open()', o 'ZipFile.extractall()' – aravenel

66

Per quanto posso dire, il modo corretto per farlo è:

import requests, zipfile, StringIO 
r = requests.get(zip_file_url, stream=True) 
z = zipfile.ZipFile(StringIO.StringIO(r.content)) 
z.extractall() 

ovviamente vorrete verificare che GET abbia avuto successo con r.ok.

Per python 3+, sottoporre il modulo StringIO al modulo io e utilizzare BytesIO invece di StringIO: Here sono note di rilascio che menzionano questa modifica.

import requests, zipfile, io 
r = requests.get(zip_file_url) 
z = zipfile.ZipFile(io.BytesIO(r.content)) 
z.extractall() 
+0

Grazie per questa risposta. L'ho usato per risolvere [il mio problema ottenere un file zip con richieste] (http://stackoverflow.com/questions/36779870/python-requests-not-returning-same-header-as-browser-request-curl/36990934# 36.990.934). –

+0

yoavram, nel tuo codice- dove inserisco l'url della pagina web? – newGIS

+4

Se si desidera salvare il file scaricato in una posizione diversa, sostituire 'z.extractall()' con 'z.extractall ("/percorso/a/destinazione_directory ")' – user799188

0

Ecco quello che ho avuto modo di lavorare in Python 3:

import zipfile, urllib.request, shutil 

url = 'http://www....myzipfile.zip' 
file_name = 'myzip.zip' 

with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file: 
    shutil.copyfileobj(response, out_file) 
    with zipfile.ZipFile(file_name) as zf: 
     zf.extractall()