Puppeteer遍历父节点子元素时innerText返回undefined求助
Puppeteer遍历子元素获取innerText返回undefined的解决方法
你遇到的核心问题是浏览器上下文和Node.js上下文混淆:
atsiskaitymas1.evaluate(x => Object.values(x.children))是在浏览器环境中执行代码,返回的是子元素的序列化普通对象(并非Puppeteer的ElementHandle实例),这些对象在Node.js环境里没有innerText属性,所以打印结果为undefined。- 你尝试的
i.evaluate和i.getAttribute('innerText')都无效:前者是因为i不是ElementHandle,没有evaluate方法;后者是因为innerText是DOM元素的属性,不是HTML标签属性,用getAttribute根本无法获取。
方案一:在浏览器上下文直接提取所有子元素文本(推荐)
直接在evaluate中完成子元素遍历和文本提取,一次性将结果返回给Node.js,效率更高:
let Atsiskaitymai = await page.$$("#slenkanti_dalis > table > tbody > tr") for (const atsiskaitymas1 of Atsiskaitymai) { // 在浏览器环境遍历tr的子元素,提取innerText并返回数组 const childTexts = await atsiskaitymas1.evaluate(tr => { return Array.from(tr.children).map(child => child.innerText.trim()); }); // 在Node.js环境打印结果 childTexts.forEach(text => console.log(text)); }
方案二:用ElementHandle逐个遍历子元素
如果需要对每个子元素执行更多操作(如点击、获取其他属性),可以用$$方法获取子元素的ElementHandle实例,再逐个提取文本:
let Atsiskaitymai = await page.$$("#slenkanti_dalis > table > tbody > tr") for (const atsiskaitymas1 of Atsiskaitymai) { // 获取当前tr的所有直接子元素('> *'确保只获取直接子节点) const childElements = await atsiskaitymas1.$$('> *'); for (const child of childElements) { // 对每个ElementHandle调用evaluate获取innerText const text = await child.evaluate(el => el.innerText.trim()); console.log(text); } }
内容的提问来源于stack exchange,提问作者Oliveinparis
相关产品推荐
相关产品推荐

