RUDE

Python — имена файлов веб-каталогов возвращаются пустыми (Requests & BeautifulSoup)

Используя плагин Requests и BeautifulSoup, я пытаюсь получить все имена файлов mp3 из определенного веб-каталога, и он ничего не возвращает.

Это функция, которую я запускаю, которая содержит проблему:

archive_url = "http://example.com/audio/"

def get_video_links():

    r = requests.get(archive_url) 
    soup = BeautifulSoup(r.content,'html5lib')  
    links = soup.findAll('a') 
    video_links = [archive_url + link['href'] for link in links if link['href'].endswith('mp3')] 
    
    return video_links 

Он не работает должным образом, поэтому, чтобы попытаться найти проблему, я запустил print(video_links), и командная строка просто выводит []. Он ничего не возвращает. Моя единственная идея заключается в том, что я мог неправильно установить плагины, не должен использовать Visual Studio 2019 или мне нужно настроить проект по-другому. Может ли кто-нибудь заметить мою глупость? Я смиренно ищу вклад.

(Я пытаюсь следовать этому руководству)


25
1

Ответ:

Решено

Во-первых, я бы предложил загрузить необходимые модули для запуска предоставленной функции:

import requests 
import bs4
from bs4 import BeautifulSoup 

Затем переопределите функцию get_video_links(), которая возвращает список, когда вывод video_links является списком:

def get_video_links(archive_url):

    r = requests.get(archive_url) 
    soup = BeautifulSoup(r.content,'html5lib')  
    links = soup.findAll('a') 
    
# ensure to pass a list
    video_links = [archive_url + link['href'] for link in links if link['href'].endswith('mp3')] 
     
    if isinstance(video_links, list):
         return video_links
    else:
        raise AttributeError:
         return("video_links is not a list, convert to list")
    

    return video_links 

Затем определите ввод для функции и вызовите его непосредственно из функции вместо использования print(video_links), который является пустым списком, поскольку он не определен в коде:

archive_url = "http://example.com/audio/"
video_links=get_video_links(archive_url=archive_url)

В двух словах:

# importing required modules

import requests 
import bs4
from bs4 import BeautifulSoup 

# define function to get the video links:
# input: a list built-in
def get_video_links(archive_url):

    r = requests.get(archive_url) 
    soup = BeautifulSoup(r.content,'html5lib')  
    links = soup.findAll('a') 
    
# ensure to pass a list
    video_links = [archive_url + link['href'] for link in links if link['href'].endswith('mp3')] 
     
    if isinstance(video_links, list):
         return video_links
    else:
        raise AttributeError:
            print("video_links is not a list, convert to list")
    

    return video_links 

# set input and call it in the function

archive_url = "http://example.com/audio/"
video_links=get_video_links(archive_url=archive_url)