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

使用Selenium Python无法获取MLB网站表格中隐藏元素数据

解决Selenium获取ESPN MLB球员统计字段为空的问题

嘿,我帮你分析下问题所在,你遇到的空值情况大概率是这几个原因导致的,咱们一步步来搞定它:

1. 页面没完全加载就急着抓数据

ESPN的赛事页面很多内容是动态渲染的,你现在的代码在打开页面后立刻去定位元素,很可能那些空白字段对应的DOM元素还没加载出来,自然抓不到内容。

解决办法:用Selenium的显式等待,等目标元素确实加载完成后再去抓取,这样能避免因加载延迟导致的空值。

2. 绝对XPATH太脆弱了

你用的是全路径的绝对XPATH,这种定位方式非常依赖页面的固定结构,一旦ESPN微调了页面布局(比如加个div、改个层级),这些XPATH就会失效,甚至定位到错误的元素。建议换成相对定位,比如结合元素的class属性或者表头文本,这样稳定性会高很多。

3. 部分字段的DOM位置可能没找对

你提到的那几个空值字段,可能是XPATH里的索引写错了(比如tbody[1]是不是对应了正确的表格体?),或者这些字段属于需要滚动到可见区域才会加载的内容。


修正后的代码示例

下面是调整后的代码,加入了显式等待,还用了更稳定的相对定位方式:

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

link = 'http://www.espn.com/mlb/boxscore?gameId=370403101'
driver = webdriver.Chrome('/PATH/chromedriver')
driver.get(link)

try:
    # 等待客场击球手表格加载完成,最多等10秒
    away_batting_table = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//article[contains(@class, "gamepackage-away-batting")]//table'))
    )
    
    # 获取第一行球员的所有数据单元格
    player_row = away_batting_table.find_element(By.TAG_NAME, 'tbody').find_element(By.TAG_NAME, 'tr')
    cells = player_row.find_elements(By.TAG_NAME, 'td')
    
    # 按表格列顺序提取字段:球员名、AB、R、H、RBI、BB、SO、P/S、AVG、OBP、SLG
    player_name_away = cells[0].find_element(By.TAG_NAME, 'a').text
    ab_away = cells[2].text
    run_away = cells[3].text
    hit_away = cells[4].text
    rbi_away = cells[5].text
    bb_away = cells[6].text
    strk_away = cells[7].text  # 三振(SO)
    p_val_away = cells[8].text  # P/S值
    avg_away = cells[9].text
    obp_away = cells[10].text
    slg_away = cells[11].text
    
    val_list_away = [player_name_away, ab_away, run_away, hit_away, rbi_away, bb_away, strk_away, p_val_away, avg_away, obp_away, slg_away]
    print(val_list_away)
    
finally:
    driver.close()

额外小建议

  • 如果要抓所有球员的数据,别只定位单个tr,改用find_elements(By.TAG_NAME, 'tr')获取所有行,再循环处理每一行。
  • 如果某些字段还是空的,打开浏览器开发者工具,直接查看这些字段的实际DOM结构,确认定位方式是否正确——有些字段可能是JS动态插入的,这时候可以试试用driver.execute_script()来获取文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:32