网页抓取问题:无特定class的<td>元素无法批量提取专辑列数据
问题分析与解决办法
核心问题
你的代码错误地直接抓取了所有<td>元素,且循环中始终固定取前5个<td>(对应第一张专辑的数据),所以只会重复输出同一专辑的信息,无法遍历所有专辑。正确的做法是按行(<tr>)分组处理,因为页面中每张专辑的数据都包裹在单独的<tr>标签里。
修正后的代码
from bs4 import BeautifulSoup import requests try: source = requests.get('https://www.popvortex.com/music/100-greatest-albums/') source.raise_for_status() soup = BeautifulSoup(source.content, 'lxml') # 找到表格中的所有行(跳过表头行) rows = soup.find(id='great-albums-table').find_all('tr')[1:] for row in rows: # 提取当前行的所有<td>元素,对应一个专辑的全部数据 tds = row.find_all('td') if len(tds) == 5: # 确保每行有完整的5个字段 rank = tds[0].text.strip() artist = tds[1].text.strip() title = tds[2].text.strip() year = tds[3].text.strip() genre = tds[4].text.strip() print(f"排名: {rank}") print(f"艺术家: {artist}") print(f"专辑名: {title}") print(f"发行年份: {year}") print(f"流派: {genre}") print("-"*30) # 分隔线,便于阅读 except Exception as e: print(e)
关键改动说明
- 按行分组:先抓取所有
<tr>标签,并用[1:]跳过第一行表头,剩下的每行对应一张专辑。 - 逐行提取字段:遍历每行时,单独提取当前行的
<td>元素,这样每次获取的都是当前专辑的5个字段。 - 文本清洗:用
strip()去除文本中的多余空格和换行符,让输出更整洁。
内容的提问来源于stack exchange,提问作者bananaboydan
相关产品推荐
相关产品推荐

