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

Selenium中结合with open的嵌套循环功能异常

问题分析与修复方案

你的代码主要存在以下几个问题,导致仅能采集到最后一位球员的数据:

  • 搜索框未清空:每次循环输入新球员名字时,未清空之前的内容,可能导致搜索关键词叠加,虽你提到能打开对应页面,但这是潜在隐患。
  • XPath定位逻辑错误:遍历stats时,使用了绝对路径的XPath//*[@id="passing"]/tfoot/tr/td[6],会直接从页面根节点查找元素,而非当前stat节点的子元素,因此每次获取的都是同一数据。
  • 未处理换行符:readlines()读取的字符串包含换行符\n,可能导致搜索的球员名称不准确。
  • 缺少页面加载等待:点击搜索按钮后页面可能未完全加载就开始抓取数据,容易出现数据未加载完全的情况。

修改后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

url = "https://www.sports-reference.com/cfb/"

# 初始化浏览器(若ChromeDriver路径不在环境变量中,需指定executable_path参数)
driver = webdriver.Chrome()
driver.get(url)

dataframe1 = []

with open('A.txt') as f:
    # 读取并去除每行的换行符与空白字符
    players = [line.strip() for line in f.readlines()]
    for player in players:
        # 定位搜索框,清空后输入球员名称
        search = driver.find_element(By.NAME, "search")
        search.clear()
        search.send_keys(player)
        # 点击搜索按钮
        button = driver.find_element(By.XPATH, '//*[@id="header"]/div[3]/form/input[1]')
        button.click()
        
        # 等待统计数据区域加载完成
        try:
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.XPATH, '//*[@id="passing"]/tfoot/tr'))
            )
            stats = driver.find_elements(By.XPATH, '//*[@id="passing"]/tfoot/tr')
            for stat in stats:
                # 使用相对路径XPath,从当前stat节点下定位目标列
                comps = stat.find_element(By.XPATH, './td[6]').text
                data = {
                    'Player': player,
                    'Completions': comps,
                }
                dataframe1.append(data)
        except Exception as e:
            print(f"采集球员{player}数据时出错: {e}")

df = pd.DataFrame(dataframe1)
print(df)
driver.close()

关键修改点说明

  1. 清空搜索框:每次输入前调用search.clear(),避免关键词叠加导致的搜索错误。
  2. 处理换行符:通过列表推导式[line.strip() for line in f.readlines()]去除每行末尾的换行符和空白字符,保证球员名称准确。
  3. 相对路径XPath:将绝对路径改为./td[6],确保从当前遍历的stat节点下查找对应数据,避免重复获取同一元素。
  4. 添加显式等待:使用WebDriverWait等待统计区域加载完成,避免因页面未加载完全导致的数据抓取失败。
  5. 异常捕获:加入try-except块,避免单个球员采集失败导致整个程序终止,同时便于排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:57:39