我正在尝试从网站检索数据并为每行数据和对象添加,我是python的新手,我显然错过了一些东西,因为我只能得到1个对象,而我试图获取的是我得到的所有排序对象按键值对:

import urllib.request
import bs4 as bs

url = 'http://freemusicarchive.org/search/?quicksearch=drake/'
search = ''
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
soup = bs.BeautifulSoup(html, 'html.parser')
tracks_info = [{}]

spans = soup.find_all('span', {'class': 'ptxt-artist'})
for span in spans:
    arts = span.find_all('a')
    for art in arts:
        print(art.text)

spans = soup.find_all('span', {'class': 'ptxt-track'})
for span in spans:
    tracks = span.find_all('a')
    for track in tracks:
        print(track.text)

for download_links in soup.find_all('a', {'title': 'Download'}):
    print(download_links.get('href'))

for info in tracks_info:
    info.update({'artist': art.text})
    info.update({'track': track.text})
    info.update({'link': download_links.get('href')})



    print(info)


我无法为从网站上获得的每个元素添加对象,我显然做错了或没有做任何事情,我们将不胜感激!

最佳答案

您可以使用略有不同的结构和语法,如下所示。

我使用一个包含CSS类选择器来检索信息行,因为每个轨道的ID不同

python - 为从网站抓取数据中添加的每个项目添加对象-LMLPHP

div[class*="play-item gcol gid-electronic tid-"]的CSS选择器组合
查找具有class属性且其值包含play-item gcol gid-electronic tid-的div元素。

然后,通过它们的类名称选择各个感兴趣的列,并为最终下载链接的a标签元素使用后代css选择器。

import urllib.request
import bs4 as bs
import pandas as pd

url = 'http://freemusicarchive.org/search/?quicksearch=drake/'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
soup = bs.BeautifulSoup(html, 'html.parser')

tracks_Info = []
headRow = ['Artist','TrackName','DownloadLink']

for item in soup.select('div[class*="play-item gcol gid-electronic tid-"]'):
    tracks_Info.append([item.select_one(".ptxt-artist").text.strip(), item.select_one(".ptxt-track").text, item.select_one(".playicn a").get('href')])

df = pd.DataFrame(tracks_Info,columns=headRow)

print(df)

09-20 22:37