使用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
相关产品推荐
相关产品推荐

