Вы можете использовать немного другой struture и синтаксис, такой как ниже.
Я использую селектор класса CSS для получения строк информации, так как идентификатор отличается для каждой дорожки
![enter image description here](https://i.stack.imgur.com/ZgZSv.png)
Селекторная комбинация CSS div[class*="play-item gcol gid-electronic tid-"]
ищет элементы div с атрибутом class, значение которого содержит play-item gcol gid-electronic tid-
.
В рамках этого различные интересующие столбцы затем выбираются по имени класса, а для элемента тега 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)