我正在尝试从网站检索数据并为每行数据和对象添加,我是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不同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)