如何用Puppeteer的evaluate/eval方法创建对象或关联数组
解决Puppeteer生成指定键值对对象的问题
你当前用map返回的是含对象的数组,而要实现{键: 文本值}的结构,不能用map,得用Array.reduce()遍历元素构建目标对象。你的错误代码箭头函数参数写法完全不符合语法规范,map的回调参数只能是单个元素,无法直接在这里定义键名。
正确实现代码
const kefs = await page.$$eval('div[data-event-treeid]', (msgs) => msgs.reduce((acc, msg) => { const key = msg.getAttribute('data-event-treeid'); acc[key] = msg.innerText; return acc; }, {}) // 初始值设为空对象 ); console.log('kefs', kefs);
代码说明
- 用
reduce替代map:reduce可以遍历数组,把每个元素的处理结果累加到初始空对象中 - 每次循环取出当前元素的
data-event-treeid作为键,innerText作为对应值,添加到累加对象acc里 - 最终返回的就是你需要的
{ "111": "Sometext", "222": "SomeOtherText" }结构
特殊情况处理
如果存在多个元素拥有相同的data-event-treeid值,后面的元素会覆盖前面的(因为对象键唯一)。若要保留所有对应文本,可把值设为数组:
const kefs = await page.$$eval('div[data-event-treeid]', (msgs) => msgs.reduce((acc, msg) => { const key = msg.getAttribute('data-event-treeid'); if (!acc[key]) acc[key] = []; acc[key].push(msg.innerText); return acc; }, {}) );
内容的提问来源于stack exchange,提问作者Max Krok
相关产品推荐
相关产品推荐

