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

如何用Selenium获取动态生成元素?现有方案失效求助

Selenium获取动态内容失败的解决思路

问题描述

此前尝试过的动态元素选择方案无效,以指定页面为例:使用Selenium获取的HTML仅包含初始静态结构,动态生成的内容未出现在div#root中,只有通过浏览器审查元素才能看到这些内容。

用户原代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get("https://www.boplatssyd.se/mypages/app")
    try:
        html = driver.find_element(by=By.TAG_NAME, value='html').get_attribute('innerHTML')
        print(html)

    except Exception as e:
        print("An error occurred:", e)

运行结果仅返回初始静态HTML(核心部分):

<!DOCTYPE html>
<html lang="sv">
<head>
    <!-- 静态头部内容 -->
    <script type="module" crossorigin src="/mypages/app/assets/index-ca5ddbcc.js"></script>
    <!-- 其他静态资源链接 -->
</head>
<body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
</body>
</html>

动态内容本应渲染在<div id="root"></div>中,但上述代码未捕获到。


解决思路及代码实现

1. 显式等待动态元素加载

直接获取HTML时,页面JavaScript尚未完成渲染,需通过显式等待确保目标元素加载完成后再操作:

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

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get("https://www.boplatssyd.se/mypages/app")
    try:
        # 等待root容器下出现至少一个子元素,最长等待15秒(可根据页面加载速度调整)
        WebDriverWait(driver, 15).until(
            EC.presence_of_element_located((By.XPATH, "//div[@id='root']/*"))
        )
        # 通过JavaScript获取完整渲染后的HTML
        rendered_html = driver.execute_script("return document.documentElement.outerHTML")
        print(rendered_html)
    except Exception as e:
        print("错误信息:", e)
    finally:
        driver.quit()

2. 检查是否需要前置交互

该页面为"Mina sidor"(我的页面),大概率需要登录验证才能加载动态内容。若未登录,页面仅会显示登录表单或空结构,需先模拟登录流程:

  • 定位用户名/密码输入框,输入账号信息
  • 定位登录按钮并点击
  • 等待登录完成后,再执行动态内容的获取逻辑

3. 排查iframe嵌套

若动态内容被嵌套在iframe中,需先切换到对应iframe再操作:

# 切换到iframe(根据实际iframe的ID/定位方式调整)
driver.switch_to.frame(driver.find_element(By.ID, "iframe-id"))
# 之后再执行等待和获取HTML的逻辑

4. 模拟页面滚动(若内容按需加载)

部分页面会在滚动时加载动态内容,可通过JavaScript模拟滚动:

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待新内容加载
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "动态内容的选择器"))
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:42:14