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

Pyppeteer无法获取Solid.js生成的HTML内容如何解决?

解决Pyppeteer无法获取Solid.js动态内容的问题

你当前的代码在页面跳转后立即获取innerHTML,但Solid.js作为客户端渲染框架,需要时间完成页面内容的生成与挂载,所以此时拿到的只是初始的空root容器和noscript提示。

可以通过等待Solid.js完成渲染的方式解决,以下是几种可行的修改方案:

方案1:等待root容器出现内容

通过waitForFunction检查root元素的内容是否已加载完成,确保获取到的是渲染后的动态内容:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    # 跳转页面时等待网络请求基本完成
    await page.goto("https://examplewebsiteusingsolidjs.com/", waitUntil='networkidle2')
    # 等待root容器内的非空内容(可根据实际情况调整判断逻辑)
    await page.waitForFunction('document.getElementById("root").innerHTML.trim() !== ""', timeout=10000)
    # 直接获取root容器内的渲染内容
    root_content = await page.evaluate('document.getElementById("root").innerHTML')
    print(root_content)
    await browser.close()

asyncio.run(main())

方案2:等待特定元素出现

如果你知道页面渲染完成后root内会出现某个特定元素(比如某个类名或ID的元素),可以用waitForSelector等待该元素加载:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto("https://examplewebsiteusingsolidjs.com/", waitUntil='networkidle2')
    # 等待root内的目标元素出现,替换成实际的选择器
    await page.waitForSelector('#root .target-element', timeout=10000)
    root_content = await page.evaluate('document.getElementById("root").innerHTML')
    print(root_content)
    await browser.close()

asyncio.run(main())

关键修改点说明

  • waitUntil='networkidle2':等待页面网络请求降至2个以内,减少过早获取内容的概率
  • waitForFunction/waitForSelector:确保Solid.js完成客户端渲染后再获取内容,避免拿到空容器
  • 增加timeout参数:防止因页面加载过慢导致超时,可根据实际情况调整时长(单位毫秒)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:59