31

我正在尝试 Puppeteer。这是您可以运行的示例代码:https ://try-puppeteer.appspot.com/

问题是这段代码返回一个空对象数组:

[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{ },{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}, {}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{}、{} ,{},{},{},{},{},{},{}]

我犯错了吗?

const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto('https://reddit.com/');

let list = await page.evaluate(() => {
  return Promise.resolve(Array.from(document.querySelectorAll('.title')));
});

console.log(JSON.stringify(list))

await browser.close();
4

3 回答 3

49

从评估函数返回的值应该是 json 可序列化的。 https://github.com/GoogleChrome/puppeteer/issues/303#issuecomment-322919968

解决方案是从元素中提取 href 值并将其返回。

 await this.page.evaluate((sel) => {
        let elements = Array.from(document.querySelectorAll(sel));
        let links = elements.map(element => {
            return element.href
        })
        return links;
    }, sel);
于 2017-09-24T02:51:08.633 回答
14

问题:

的返回值page.evaluate()必须是可序列化的。

根据Puppeteer 文档,它说:

如果传递给 的函数page.evaluate返回一个不可序列化的值,则page.evaluate解析为undefined. DevTools 协议还支持传输一些无法通过JSON: -0NaNInfinity-Infinity和 bigint 文字序列化的附加值。

换句话说,您不能将页面 DOM 环境中的元素返回到 Node.js 环境,因为它们是分开的。

解决方案:

您可以将ElementHandleDOM 返回到 Node.js 环境,它是页内 DOM 元素的表示形式。

用于page.$$()获取ElementHandle数组:

let list = await page.$$('.title');

否则,如果您想href从元素中提取值并返回它们,您可以使用page.$$eval()

let list = await page.$$eval('.title', a => a.href);
于 2020-03-13T00:09:17.130 回答
10

我遇到了类似的问题,我这样解决了;

 await page.evaluate(() => 
       Array.from(document.querySelectorAll('.title'), 
       e => e.href));
于 2019-11-07T14:33:40.197 回答