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

