Html 使用Beauty soup从网站获取所有mp3文件——递归

Html 使用Beauty soup从网站获取所有mp3文件——递归,html,python-3.x,beautifulsoup,Html,Python 3.x,Beautifulsoup,在这里很难找到这个问题的答案,我知道我已经找了一个多小时了。很多人都很接近,我尝试过其中一些人的零碎想法,但我仍然没有找到解决办法。(到目前为止,请参见更新) 试图从中提取所有MP3文件,但它们嵌套得很深。我想我可以提供URL和bs将递归地跟踪所有链接,并对它们进行过滤,以获得要下载的特定文件。显然,找到的每个href都必须被请求并解析该页面上的链接 我有从包含MP3的页面中提取MP3的代码,但对所有此类页面(自上而下递归)这样做并不像bs文档让我相信的那样容易 更新:在门德尔格和其他人的帮助下

在这里很难找到这个问题的答案,我知道我已经找了一个多小时了。很多人都很接近,我尝试过其中一些人的零碎想法,但我仍然没有找到解决办法。(到目前为止,请参见更新)

试图从中提取所有MP3文件,但它们嵌套得很深。我想我可以提供URL和bs将递归地跟踪所有链接,并对它们进行过滤,以获得要下载的特定文件。显然,找到的每个href都必须被请求并解析该页面上的链接

我有从包含MP3的页面中提取MP3的代码,但对所有此类页面(自上而下递归)这样做并不像bs文档让我相信的那样容易

更新:在门德尔格和其他人的帮助下,我修改了代码。我相信这可以完成任务,但将[大尺寸]文件内容放入变量可能需要通过某种下载-写入、下载-写入方案进行改进,以减少内存影响:

def getMP3sOnPageP(session, h, p):
    soup = BeautifulSoup(session.get(p, headers=h).content, "html.parser")

    # Select all the buttons on this page with the text `LISTEN`
    for tag in soup.select("a.button"):
        # Extracts the link from the button, in order to perform a request to that page
        page = tag["href"]
        soup = BeautifulSoup(session.get(page, headers=h).content, "html.parser")

        # Finds the link to the mp3 file
        download_link = soup.select_one("a.btn[download]")["href"]
        file_name = re.search(r'(\d+-Hour-1.mp3)', download_link.split("/")[-1]).group()

        # Request the mp3 file
        print("Downloading ", file_name)
        mp3_file = session.get(download_link).content
        with open(file_name, "wb") as f:
            f.write(mp3_file)

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
with requests.Session() as session:
    soup = BeautifulSoup(session.get(URL, headers=HEADERS).content, "html.parser")

    # Select all the links on this page with a class of "page-numbers"
    for a in soup.select("a.page-numbers"):
        getMP3sOnPageP(session, HEADERS, a.get("href"))

正如您所见,这需要3次调用beautiful soup(bs)。我对文档的阅读使我相信bs将递归运行,这样一个具有正确过滤/参数的调用就足够了。如果是,我肯定不知道怎么做。

我提供的更新解决了我的问题。尽管用户MendelG发布了一个回复,但它并没有解决整个问题,尽管它非常有用。他的贡献体现在我的更新中的getMP3sOnPageP函数中。

我提供的更新解决了我的问题。尽管用户MendelG发布了一个回复,但它并没有解决整个问题,尽管它非常有用。他的贡献体现在我的更新中的getMP3sOnPageP函数中