如何使用来自(可能)破坏的html的beautifulsoup过滤掉.mp3链接? (JSON)

时间:2017-07-28 12:44:22

标签: python html json beautifulsoup

我想构建一个小工具来帮助家庭成员从网站上下载播客。

为了获取文件的链接,我首先需要将它们过滤掉(使用bs4 + python3)。 这些文件在这个网站上(爱沙尼亚语):Download Page “Laadi alla”=“下载”

到目前为止,我的代码如下: (大部分来自stackoverflow上的示例)

from bs4 import BeautifulSoup

import urllib.request
import re

url = urllib.request.urlopen("http://vikerraadio.err.ee/listing/mystiline_venemaa#?page=1&pagesize=902&phrase=&from=&to=&path=mystiline_venemaa&showAll")
content = url.read()
soup = BeautifulSoup(content, "lxml")

links = [a['href'] for a in soup.find_all('a',href=re.compile('http.*\.mp3'))]
print ("Links:", links)

不幸的是,我总是得到两个结果。 输出:

Links: ['http://heli.err.ee/helid/exp/ERR_raadiouudised.mp3', 'http://heli.err.ee/helid/exp/ERR_raadiouudised.mp3']

这些不是我想要的。 我最好的猜测是页面有点破坏html和bs4 /解析器无法找到任何其他内容。 我尝试了不同的解析器,没有任何变化。 也许我也做错了其他事。

我的目标是将列表中的各个链接作为示例。 我将在以后自行过滤掉任何重复/不需要的条目。

快速说明,以防万一:这是一个公共广播,所有内容都是合法托管的。

我的新代码是:

for link in soup.find_all('d2p1:DownloadUrl'): 
    print(link.text) 

我不确定是否正确选择了标签。

此问题中列出的所有示例实际上都没有效果。请参阅下面的答案,了解工作代码。

1 个答案:

答案 0 :(得分:2)

请注意,页面中的商家信息是通过API进行的。因此,我建议您不要请求HTML页面,而是请求具有200个.mp3链接的API链接。

请按照以下步骤操作:

  1. 请求API链接,而不是HTML页面链接
  2. 检查回复,它是一个JSON。因此,提取您需要的字段
  3. 帮助您的家人,所有时间:)
  4. <强>解决方案

    import requests, json
    from bs4 import BeautifulSoup
    
    myurl = 'http://vikerraadio.err.ee/api/listing/bypath?path=mystiline_venemaa&page=1&pagesize=200&phrase=&from=&to=&showAll=false'
    r = requests.get(myurl)
    abc = json.loads(r.text)
    
    all_mp3 = {}
    for lstngs in abc['ListItems']:
        for asd in lstngs['Podcasts']:
            all_mp3[asd['DownloadUrl']] = lstngs['Header']
    
    all_mp3
    

    all_mp3 就是您所需要的。 all_mp3 是一个字典, 下载网址 作为键, mp3名称 作为值。