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

使用Python Selenium读取隐藏span文本遇NoSuchElementException的可行方案

问题描述

爬取某网站时,尝试读取span元素文本内容,抛出NoSuchElementException异常,提示:

Unable to locate element: .horse-764aj7-startlistraceinfodetails-styles--container

推测目标元素被带有aria-hidden="true"属性的元素遮挡,尝试点击data-test-id为toggle-race-info的按钮(该按钮用于显示网页文本)后,仍抛出异常。

相关代码:

raceProp = driver.find_element(By.CLASS_NAME,"horse-764aj7-startlistraceinfodetails-styles--container")
spans = driver.find_elements(By.TAG_NAME,"span") 

对应的HTML结构:

<div class="startlist-header__race-title">
  <div role="button" tabindex="0" class="race-info-toggle race-info-toggle--expanded" data-test-id="toggle-race-info">
    <svg viewBox="0 0 32 32" focusable="false" aria-hidden="true" class="horse-1r0kb3k-SvgIcon-styles--rootStyle-SvgIcon-styles--fontSize-startlistheader-styles--toggleIcon-SvgIcon--SvgIcon">
          <path d="M13.5 17.2c.7-.6 1.5-1 2.5-1s1.8.4 2.5 1l8.8 8.9c.7.7 1.1 1.5 1.1 2.4 0 .9-.4 1.8-1 2.5-.7.6-1.6 1-2.5 1-.9 0-1.8-.4-2.5-1L16 24.6 9.6 31c-.7.6-1.5 1-2.5 1s-1.8-.4-2.4-1c-1.4-1.4-1.4-3.6 0-4.9l8.8-8.9zM24.9 15.8c-.9 0-1.8-.3-2.5-1L16 8.4l-6.4 6.4c-.7.7-1.5 1-2.5 1-.9 0-1.8-.3-2.4-1-1.4-1.3-1.4-3.5 0-4.9l8.8-8.8c.7-.7 1.5-1 2.5-1s1.8.3 2.5 1l8.8 8.8c.7.7 1.1 1.6 1.1 2.5 0 .9-.4 1.8-1 2.4-.7.7-1.6 1-2.5 1z"></path>
    </svg>
  </div>
</div>

<div class="flexboxgrid2_col-xs-12_2A">
  <div data-test-id="startlist-info-container" class="horse-764aj7-startlistraceinfodetails-styles--container">
    <span class="horse-nqsei7-startlistraceinfodetails-styles--infoContainer-startlistraceinfodetails-styles--infoName-startlistraceinfodetails--StartlistRaceInfoDetails">Breddlopp - Sleipner Bergsåkers Månadstäcke - P21-lopp</span>
    <span class="horse-nxbcp8-startlistraceinfodetails-styles--infoContainer">Pris: 10.000-5.000-3.500-2.500-2.100-2.000-2.000-2.000 kr (8 priser). Lägst 1.500 kr till alla tävlande.</span>
  </div>
</div>
解决方案
  • 等待元素加载完成:网页未完全渲染就执行查找操作是常见原因,用显式等待替代直接查找:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 等待并点击toggle按钮
    toggle_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-test-id="toggle-race-info"]'))
    )
    toggle_btn.click()
    
    # 等待目标容器加载完成
    raceProp = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "horse-764aj7-startlistraceinfodetails-styles--container"))
    )
    
    # 获取容器下的span元素
    spans = raceProp.find_elements(By.TAG_NAME, "span")
    for span in spans:
        print(span.text)
    
  • 更换定位方式:CLASS_NAME遇到带特殊字符的类名可能失效,改用CSS_SELECTOR更稳定:
    raceProp = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.horse-764aj7-startlistraceinfodetails-styles--container'))
    )
    
  • 强制读取文本:若元素存在但不可见,用JavaScript强制获取文本:
    span_text = driver.execute_script("return arguments[0].textContent;", span_element)
    
  • 修复按钮点击:如果常规点击无效,用JavaScript模拟点击按钮:
    driver.execute_script("arguments[0].click();", toggle_btn)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:47:41