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

Selenium调用execute_script抓取ASX.au返回None/错误,求技术支持

问题分析与解决方案

核心问题

你的代码存在几个关键问题导致execute_script返回None或报错:

  • 硬编码等待不可靠:time.sleep无法保证元素完全加载,可能执行脚本时目标DOM节点还未生成
  • 返回DOM节点而非文本:直接返回DOM元素对象,Selenium Python绑定无法正确序列化这类对象,会返回None
  • DOM结构索引易失效:依赖tr[1]、cells[3]这类固定索引,页面结构一旦变动就会失效

修正后的代码

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def scrape_asx():
    driver = get_driver()
    driver.get('http://www.asx.com.au/asx/statistics/prevBusDayAnns.do')
    driver.maximize_window()

    # 处理Cookie弹窗,等待按钮可点击后再操作
    WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'onetrust-accept-btn-handler'))
    ).click()

    # 等待表格行加载完成,确保DOM节点已生成
    target_row = WebDriverWait(driver, 15).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'table tr'))
    )[1]

    # 方法1:用Selenium原生定位获取文本(更易维护)
    target_text = target_row.find_elements(By.TAG_NAME, 'td')[3].find_element(By.TAG_NAME, 'a').text

    # 方法2:如果一定要用execute_script,返回文本而非DOM节点
    # target_text = driver.execute_script("return document.getElementsByTagName('tr')[1].cells[3].firstElementChild.textContent;")

    driver.quit()
    return target_text

关键改进点

  • 显式等待替代固定sleep:用WebDriverWait等待元素可交互/存在,确保DOM加载完成后再操作,避免因加载速度差异导致的错误
  • 优先使用Selenium原生定位:比直接执行JS更易维护,出错时也更容易排查定位问题
  • 返回文本而非DOM对象:如果用JS脚本,直接返回textContent或innerText,避免元素对象序列化失败的问题
  • 增加资源清理:调用driver.quit()关闭浏览器,避免残留进程

额外建议

  • 尽量避免依赖固定索引定位元素,优先使用元素的唯一标识(如CSS类名、数据属性),降低页面结构变动带来的维护成本
  • 如果页面存在动态加载的内容,可检查是否有未完成的AJAX请求,必要时等待特定请求结束后再提取数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:15:35