Everynoise网站爬取数据格式异常求助:流派专辑数据规整
问题分析与解决方案
核心问题
- 跨流派抓取专辑:原代码用
find_next_siblings('div', class_='albumbox album')会获取当前流派div之后所有同级的专辑div,导致一个流派绑定了后续所有流派的专辑,造成流派映射错误。 - 不必要的列表提取:每个
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®ion=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
相关产品推荐
相关产品推荐

