2012-02-23 40 views

Trả lời

5

Sử dụng urllib2.urlopen. Giá trị trả lại là một đối tượng giống như tệp mà bạn có thể read(), chuyển đến zipfile và cứ tiếp tục như vậy.

3

Hoặc sử dụng urllib2.urlopen, hoặc bạn có thể thử bằng cách sử dụng mô-đun Requests tuyệt vời và tránh đau đầu urllib2:

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

Nhưng làm thế nào để bạn phân tích results.content int a zip? – 0atman

+0

Sử dụng mô-đun 'zipfile': ' zip = zipfile.ZipFile (results.content) '. Sau đó, chỉ phân tích cú pháp các tệp bằng cách sử dụng 'ZipFile.namelist()', 'ZipFile.open()', hoặc 'ZipFile.extractall()' – aravenel

66

Theo như tôi có thể nói, những cách thích hợp để làm điều này là:

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

tất nhiên bạn muốn kiểm tra xem GET đã thành công với r.ok hay chưa.

Đối với python 3+, hãy đặt mô-đun StringIO với mô-đun io và sử dụng BytesIO thay vì StringIO: Here là ghi chú phát hành đề cập đến thay đổi này.

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

Cảm ơn câu trả lời này. Tôi đã sử dụng nó để giải quyết [vấn đề của tôi nhận được tệp zip có yêu cầu] (http://stackoverflow.com/questions/36779870/python-requests-not-returning-same-header-as-browser-request-curl/36990934# 36990934). –

+0

yoavram, trong mã của bạn - nơi tôi nhập url của trang web? – newGIS

+4

Nếu bạn muốn lưu tệp đã tải xuống ở một vị trí khác, thay thế 'z.extractall()' bằng 'z.extractall ("/path/to/destination_directory ")' – user799188

0

Đây là những gì tôi đã làm việc trong 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() 
Các vấn đề liên quan