#python #http #directory #iterator
#python #http #каталог #итератор
Вопрос:
На http-сервере есть каталог, URL которого http://somehost/maindir/recent /. И этот «недавний» каталог содержит, скажем, 50 подкаталогов zip.
Я могу прочитать один zip-файл с
zfile = "http://somehost/maindir/recent/1.zip"
with RemoteZip(zfile) as zip:
for zip_info in zip.infolist():
data = zip.read(zip_info.filename)
Но я не получаю никакой идеи для повторения «http://somehost/maindir/recent /» и прочитать данные из каждого ZIP-файла. Я пробовал glob, os.join, os.walk, но в том же духе.
Я хочу что-то вроде этого:
for zfile in baseurl: //unable to do this line.
with RemoteZip(zfile) as zip:
for zip_info in zip.infolist():
data = zip.read(zip_info.filename)
Ответ №1:
Вы не можете получить список каталогов напрямую, поскольку за возврат ответа отвечает HTTP-сервер, в некоторых случаях вы получите HTML-страницу, отображающую ссылки на все файлы внутри «каталога», как в вашем случае «http://somehost/maindir/recent /» выдаст вам список всех zip-файлов внутри последнего каталога, но в формате html.
Одним из решений может быть использование Beautifulsoup для анализа этой html-страницы и извлечения всех ссылок на zip-файлы с этой «недавней» страницы каталога.
from bs4 import BeautifulSoup
import requests
url = 'http://somehost/maindir/recent/'
def get_files(url):
page = requests.get(url).text
soup = BeautifulSoup(page, 'html.parser')
return [url '/' node.get('href') for node in soup.find_all('a') if
node.get('href').endswith('.zip')]
file_links = get_files(url)
for zfile in file_links:
with RemoteZip(zfile) as zip:
for zip_info in zip.infolist():
data = zip.read(zip_info.filename)
Комментарии:
1. Я такой новичок, что не додумался до этой идеи. Спасибо! Я получил список URL-адресов zip-файлов.