如何通过Puppeteer获取元素的子代

时间:2019-04-12 20:36:23

标签: node.js puppeteer

我知道puppeteer拥有自己的句柄,而不是标准的DOM元素,但是我不明白为什么我无法通过找到的元素继续与

相同的查询
const els = await page.$$('div.parent');

for (let i = 0; i < els.length; i++) {
    const img = await els[i].$('img').getAttribute('src');
    console.log(img);
    const link = await els[i].$('a').getAttribute('href');
    console.log(link);
}

2 个答案:

答案 0 :(得分:3)

问题

元素句柄作为Node.js和浏览器运行时之间的抽象层是必需的。实际的DOM元素不会发送到Node.js环境。

这意味着当您想从元素中获取属性时,必须将数据传输到浏览器(要使用的DOM元素),再传输回(结果)。

解决方案

因此,await els[i].$('img')的结果实际上不是DOM元素,而只是链接到浏览器环境中的元素的包装器。要获取属性,必须使用类似elementHandle.$eval的函数:

const imgSrc = await els[i].$eval('img', el => el.getAttribute('src'));

这将在给定元素上运行querySelector函数,并执行给定函数以返回其属性。

答案 1 :(得分:2)

您可以使用$eval

onst els = await page.$$('div.parent');

for (let i = 0; i < els.length; i++) {
    const img = await els[i].$eval('img', i => i.getAttribute('src'));
    console.log(img);
    const link = await els[i].$eval('a', a => a.getAttribute('href'));
    console.log(link);
}