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

网页抓取问题:无特定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:52:35