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
相关产品推荐
相关产品推荐

