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

网页爬取求助:如何提取指定文本并保存至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:52:43