首页 > 解决方案 > 为从网站抓取数据添加的每个项目添加对象

问题描述

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

我没有为我从网站上获得的每个元素添加一个对象,我显然做错了什么\或没有做,任何帮助将不胜感激!

标签: pythonobjectweb-scrapingbeautifulsouprequest

解决方案


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

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

在此处输入图像描述

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)

推荐阅读