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

使用BS4/Selenium无法定位ESPN Fantasy球员元素的技术求助

问题原因分析

BS4失败原因

BS4仅能解析静态HTML内容,ESPN Fantasy的球员数据是通过JavaScript动态渲染加载的,页面初始HTML中不存在目标元素,因此find_all返回None。

Selenium失败原因

  1. CSS选择器语法错误:你写的'Table__TR Table__TR--lg Table__odd'是后代选择器逻辑,会查找Table__TR元素下的Table__TR--lg元素,再找其下的Table__odd元素,但目标元素是同时拥有这三个class的节点,正确写法应该用.连接多个class且无空格:.Table__TR.Table__TR--lg.Table__odd。
  2. 未等待页面加载完成:Selenium打开页面后立即执行元素查找,此时目标元素可能还未通过JS渲染出来,导致找不到元素。
  3. 路径转义问题:Windows下路径中的\是转义字符,直接写"C:\ChromeDrive\chromedriver.exe"可能导致路径解析错误,建议用原始字符串或转义双斜杠。
代码改进方案

以下是修正后的代码,包含显式等待、正确的选择器和路径处理:

# 抓取ESPN Fantasy球队球员姓名
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

# 使用原始字符串避免路径转义问题
PATH = r"C:\ChromeDrive\chromedriver.exe"
driver = webdriver.Chrome(PATH)

try:
    driver.get("https://fantasy.espn.com/basketball/team?leagueId=454981630&seasonId=2023&teamId=10")
    print(driver.title)

    # 显式等待目标tbody元素加载完成,最长等待10秒
    tbody = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "Table__TBODY"))
    )
    # 查找所有球员行,包含奇偶行两种class
    player_rows = tbody.find_elements(By.CSS_SELECTOR, ".Table__TR.Table__TR--lg.Table__odd, .Table__TR.Table__TR--lg.Table__even")
    
    # 提取球员姓名
    player_names = []
    for row in player_rows:
        # 定位球员姓名所在的链接元素,可根据页面实际结构调整
        name_elem = row.find_element(By.CSS_SELECTOR, ".Table__TD a")
        player_names.append(name_elem.text)
    
    print("球员姓名列表:")
    for name in player_names:
        print(name)

finally:
    driver.quit()

关键改进点说明

  • 显式等待:用WebDriverWait等待目标元素出现,替代直接查找,确保元素已渲染完成。
  • 修正CSS选择器:多个class用.连接,同时兼容奇偶行的两种class,避免遗漏球员条目。
  • 路径处理:用原始字符串r""避免Windows路径转义错误。
  • 资源清理:用try...finally确保浏览器窗口最终关闭,避免资源泄漏。

若页面出现Cookie同意弹窗,可在driver.get后添加弹窗处理代码:

try:
    accept_btn = WebDriverWait(driver, 5).until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept')]"))
    )
    accept_btn.click()
except:
    # 无弹窗则跳过
    pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:10:37