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

