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

Python使用requests+bs4遍历HTML表格成绩的循环逻辑问题

问题根因

你的循环逻辑存在核心错误,导致所有数据重复:
遍历tr行对象时,你从未使用当前循环拿到的行实例,每次都在整个tbody范围调用find_all('td'),拿到的永远是全表所有单元格,每次取td[0]自然永远是第一个科目的内容;同时没有做无效行过滤,遇到表头、空行时容易触发索引错误或者写入脏数据;分开四个独立循环打印列表,也无法直观校验同索引数据的关联关系。

修正后可运行代码
# 前置请求、页面解析逻辑保留你原有写法即可,例:
# resp = requests.get(成绩页地址, headers=你的请求头)
# soup = BeautifulSoup(resp.text, 'html.parser')
# tbody = soup.find('table', 你的成绩表定位参数).find('tbody')

# 初始化四个关联列表,同索引对应同一条成绩记录
subject = []
f_quar = []
s_quar = []
average = []

# 遍历所有行
for row in tbody.find_all('tr'):
    # 核心修正:从当前行内查找单元格,而非全表查找
    row_tds = row.find_all('td')
    # 跳过td数量不足4的无效行(表头、空行、分隔行)
    if len(row_tds) < 4:
        continue
    # 提取文本时自动去除首尾空白、换行符,按索引存入对应列表
    subject.append(row_tds[0].get_text(strip=True))
    f_quar.append(row_tds[1].get_text(strip=True))
    s_quar.append(row_tds[2].get_text(strip=True))
    average.append(row_tds[3].get_text(strip=True))

# 按索引同步遍历四个列表,直接输出关联的完整成绩记录
for i in range(len(subject)):
    print(f"科目: {subject[i]}")
    print(f"第一季度成绩: {f_quar[i]}")
    print(f"第二季度成绩: {s_quar[i]}")
    print(f"平均分: {average[i]}")
    print("-"*30)
注意事项
  • 只要保证四个列表每次循环都按相同顺序追加元素,同索引位置的数据必然是一一对应的,不会出现错位
  • 如果表格里存在合并单元格的情况,可以先打印len(row_tds)判断每行列数,再调整取值索引即可
  • get_text(strip=True)可以自动清理HTML源码里缩进、换行带来的多余空白字符,不需要额外做字符串替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:57:22