Puppeteer page.evaluate querySelectorAll return 空对象
Puppeteer page.evaluate querySelectorAll return empty objects
我正在试用 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();
从评估函数中 return 编辑的值应该 json 可序列化。
https://github.com/GoogleChrome/puppeteer/issues/303#issuecomment-322919968
解决方案是从元素中提取 href 值并 return 它。
await this.page.evaluate((sel) => {
let elements = Array.from(document.querySelectorAll(sel));
let links = elements.map(element => {
return element.href
})
return links;
}, sel);
我遇到了类似的问题,我是这样解决的;
await page.evaluate(() =>
Array.from(document.querySelectorAll('.title'),
e => e.href));
问题:
page.evaluate()
must be serializable 的 return 值。
根据Puppeteer documentation,它说:
If the function passed to the page.evaluate
returns a non-Serializable value, then page.evaluate
resolves to undefined
. DevTools Protocol also supports transferring some additional values that are not serializable by JSON
: -0
, NaN
, Infinity
, -Infinity
, and bigint literals.
换句话说,您不能 return 页面 DOM 环境中的元素返回 Node.js 环境,因为它们是分开的。
解法:
您可以 return 一个 ElementHandle
,它是页内 DOM 元素的表示,返回到 Node.js 环境。
使用page.$$()
得到一个ElementHandle
数组:
let list = await page.$$('.title');
否则,如果你想提取 href
values from the elements and return them, you can use page.$$eval()
:
let list = await page.$$eval('.title', a => a.href);
我正在试用 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();
从评估函数中 return 编辑的值应该 json 可序列化。 https://github.com/GoogleChrome/puppeteer/issues/303#issuecomment-322919968
解决方案是从元素中提取 href 值并 return 它。
await this.page.evaluate((sel) => {
let elements = Array.from(document.querySelectorAll(sel));
let links = elements.map(element => {
return element.href
})
return links;
}, sel);
我遇到了类似的问题,我是这样解决的;
await page.evaluate(() =>
Array.from(document.querySelectorAll('.title'),
e => e.href));
问题:
page.evaluate()
must be serializable 的 return 值。
根据Puppeteer documentation,它说:
If the function passed to the
page.evaluate
returns a non-Serializable value, thenpage.evaluate
resolves toundefined
. DevTools Protocol also supports transferring some additional values that are not serializable byJSON
:-0
,NaN
,Infinity
,-Infinity
, and bigint literals.
换句话说,您不能 return 页面 DOM 环境中的元素返回 Node.js 环境,因为它们是分开的。
解法:
您可以 return 一个 ElementHandle
,它是页内 DOM 元素的表示,返回到 Node.js 环境。
使用page.$$()
得到一个ElementHandle
数组:
let list = await page.$$('.title');
否则,如果你想提取 href
values from the elements and return them, you can use page.$$eval()
:
let list = await page.$$eval('.title', a => a.href);