Выполнить итерацию по URL сервера индексированного каталога и прочитать файлы

#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-файлов.