网页爬取求助:如何提取指定文本并保存至DataFrame?
问题分析与修复方案
你的代码存在几个关键问题导致无法正确获取目标数据,以下是修复后的代码及说明:
主要问题点
- 循环层级错误:遍历表格时,你用
soup.find_all('tbody')和soup.find_all('tr')会重复抓取整个页面的所有tbody和tr,而非当前表格下的子元素,导致数据重复混乱。 - 内容提取错误:
row.find('td')仅获取每行第一个td元素,未提取文本;row.find_all('a')拿到的是链接对象,未提取运动员名称的纯文本。 - 列定位模糊:未明确指定成绩和运动员对应的列位置,导致数据错位。
修复后的代码
import requests from bs4 import BeautifulSoup import pandas as pd url = 'https://www.tfrrs.org/results/xc/22268/_FURMAN_XC_INVITE' header = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } resp = requests.get(url, headers=header) soup = BeautifulSoup(resp.text, 'html.parser') pl_team = [] atleta = [] # 遍历每个表格,仅处理当前表格下的子元素 for tabla in soup.find_all("table"): for tbody in tabla.find_all('tbody'): for row in tbody.find_all('tr'): tds = row.find_all('td') # 确保行有足够单元格,避免索引报错 if len(tds) >= 5: # 提取第5个td的成绩文本(索引从0开始) pl_team.append(tds[4].get_text(strip=True)) # 提取运动员名称,无链接时设为默认值 athlete_tag = row.find('a') atleta.append(athlete_tag.get_text(strip=True) if athlete_tag else "未知") # 生成DataFrame并保存 df = pd.DataFrame({"成绩": pl_team, "运动员": atleta}) df.reset_index(drop=True, inplace=True) df.to_csv('tffrs2.csv', index=False) print(df)
关键修复说明
- 调整层级查找:用
tabla.find_all('tbody')和tbody.find_all('tr')限制查找范围,确保只处理当前表格内的行数据。 - 精准提取文本:指定成绩所在列索引,用
get_text(strip=True)去除多余空格,获取纯文本内容。 - 增加异常处理:判断单元格数量、处理无运动员链接的情况,避免代码运行报错。
内容的提问来源于stack exchange,提问作者Eltruji
相关产品推荐
相关产品推荐

