You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Everynoise网站爬取数据格式异常求助:流派专辑数据规整

问题分析与解决方案

核心问题

  1. 跨流派抓取专辑:原代码用find_next_siblings('div', class_='albumbox album')会获取当前流派div之后所有同级的专辑div,导致一个流派绑定了后续所有流派的专辑,造成流派映射错误。
  2. 不必要的列表提取:每个albumbox album对应单张专辑,原代码用列表推导式提取艺术家、专辑信息,导致单元格存列表而非单个值。

修正后的代码

import pandas as pd
from bs4 import BeautifulSoup
import requests

# 初始化数据容器
data = {
    "Genre": [],
    "Artist": [],
    "Title": [],
    "Artist_Link": [],
    "Album_URL": [],
    "Genre_Link": []
}

# 请求目标页面
url = "https://everynoise.com/new_releases_by_genre.cgi?genre=local&region=NL&date=20230428&hidedupes=on"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

genre_divs = soup.find_all('div', class_='genrename')

for genre_div in genre_divs:
    genre_name = genre_div.text.strip()
    genre_link = genre_div.find('a').get('href')
    
    # 仅抓取当前流派下的专辑div(遇到下一个流派即停止)
    album_divs = []
    for sibling in genre_div.find_next_siblings():
        if sibling.get('class') and 'genrename' in sibling.get('class'):
            break
        if sibling.get('class') and 'albumbox' in sibling.get('class') and 'album' in sibling.get('class'):
            album_divs.append(sibling)
    
    for album_div in album_divs:
        # 提取单张专辑的独立信息
        try:
            artist_name = album_div.find('b').text.strip()
            title = album_div.find('a', title=True).get('title').strip()
            artist_link = album_div.find('a', href=lambda x: x and 'Aartist' in x).get('href')
            album_url = album_div.find('a', onclick=True).get('href')
            
            # 追加单条数据到容器
            data["Genre"].append(genre_name)
            data["Artist"].append(artist_name)
            data["Title"].append(title)
            data["Artist_Link"].append(artist_link)
            data["Album_URL"].append(album_url)
            data["Genre_Link"].append(genre_link)
        except AttributeError:
            # 跳过结构异常的条目,避免爬虫中断
            continue

# 生成规整的DataFrame
df = pd.DataFrame(data)
print(df.head())

关键优化点

  • 限定流派范围:通过遍历后续兄弟元素并判断是否为下一个流派,确保只抓取当前流派的专辑,修正流派映射错误。
  • 单值提取:针对每个专辑div直接提取单个艺术家、专辑信息,避免生成列表,实现每行对应一条完整的流派-艺术家-专辑数据。
  • 异常处理:添加try-except跳过结构异常的条目,提升爬虫稳定性。

内容的提问来源于stack exchange,提问作者jsb92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:32:00