Python для вывода списка HTTP-файлов и каталогов

3

Как я могу перечислить файлы и папки, если у меня есть только IP-адрес?

С urllib и другими, я могу отображать только содержимое файла index.html. Но что, если я хочу посмотреть, какие файлы находятся в корне, а?

Я ищу пример, который показывает, как реализовать имя пользователя и пароль, если это необходимо. (В большинстве случаев index.html является общедоступным, но иногда другие файлы не являются).

Теги:
directory
ip-address

5 ответов

9

Используйте requests, чтобы получить содержимое страницы и BeautifulSoup, чтобы проанализировать результат.
Например, если мы ищем все iso файлы в http://cdimage.debian.org/debian-cd/8.2.0-live/i386/iso-hybrid/:

from bs4 import BeautifulSoup
import requests

url = 'http://cdimage.debian.org/debian-cd/8.2.0-live/i386/iso-hybrid/'
ext = 'iso'

def listFD(url, ext=''):
    page = requests.get(url).text
    print page
    soup = BeautifulSoup(page, 'html.parser')
    return [url + '/' + node.get('href') for node in soup.find_all('a') if node.get('href').endswith(ext)]

for file in listFD(url, ext):
    print file
5

HTTP не работает с "файлами" и "каталогами". Выберите другой протокол.

4

Вы не можете получить список каталогов напрямую через HTTP, как говорит другой ответ. Это HTTP-сервер, который "решает", что вам дать. Некоторые из них дадут вам HTML-страницу, отображающую ссылки на все файлы внутри "каталога", некоторые предоставят вам некоторую страницу (index.html), а некоторые даже не будут интерпретировать "каталог" как один.

Например, у вас может быть ссылка на "http://localhost/user-login/": это не означает, что в корневом каталоге сервера есть каталог с именем user-login. Сервер интерпретирует это как "ссылку" на какую-то страницу.

Теперь, чтобы достичь того, чего вы хотите, вам нужно либо использовать что-то другое, чем HTTP (FTP-сервер на "ip-адрес", который вы хотите получить, выполнит задание) или настройте HTTP-сервер на этом компьютере, который предоставляет каждому пути (http://192.168.2.100/directory) список файлов в нем (в любом формате) и анализирует его через Python.

Если сервер предоставляет страницу типа "индекс/bla/bla" (например, сервер Apache, списки каталогов), вы можете проанализировать вывод HTML, чтобы узнать имена файлов и каталогов. Если нет (например, пользовательский index.html, или что-то, что сервер решает дать вам), вам не повезло:(, вы не можете этого сделать.

  • 0
    отличный ответ. Спасибо за вашу помощь. Действительно, index.html дает мне имена других файлов и папок. Возможно, я могу попытаться получить это.
  • 1
    Отлично :) В таком случае попробуйте поискать html-разбор в python, например, с помощью BeautifulSoup. Для этого есть и другие библиотеки.
0

Zety обеспечивает приятное компактное решение. Я бы добавил к его примеру, сделав компонент requests более надежным и функциональным:

import requests
from bs4 import BeautifulSoup

def get_url_paths(url, ext='', params={}):
    response = requests.get(url, params=params)
    if response.ok:
        response_text = response.text
    else:
        return response.raise_for_status()
    soup = BeautifulSoup(response_text, 'html.parser')
    parent = [url + node.get('href') for node in soup.find_all('a') if node.get('href').endswith(ext)]
    return parent

url = 'http://cdimage.debian.org/debian-cd/8.2.0-live/i386/iso-hybrid'
ext = 'iso'
result = get_url_paths(url, ext)
print(result)
0

Вы можете использовать следующий script, чтобы получить имена всех файлов в подкаталогах и каталогах на HTTP-сервере. Для их загрузки может использоваться файл.

from urllib.request import Request, urlopen, urlretrieve
from bs4 import BeautifulSoup
def read_url(url):
    url = url.replace(" ","%20")
    req = Request(url)
    a = urlopen(req).read()
    soup = BeautifulSoup(a, 'html.parser')
    x = (soup.find_all('a'))
    for i in x:
        file_name = i.extract().get_text()
        url_new = url + file_name
        url_new = url_new.replace(" ","%20")
        if(file_name[-1]=='/' and file_name[0]!='.'):
            read_url(url_new)
        print(url_new)

read_url("www.example.com")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню