javascript - 试图弄清楚如何使用 Puppeteer 根据类名提取 DOM 元素的集合
问题描述
我正在抓取的网页有几个 DIV 元素,它们的 CSS 类名称为“ s-suggestion ”。
我希望从这些元素中获取数据集值。
我的脚本中有以下代码行(在 node.js 上运行):
const suggestions = await page.$$eval('.s-suggestion',(divs) => divs);
当我查看它的值时,suggestions.length
它是 10。
现在下面的代码:
for (let n=0;n<suggestions.length;n++) {
const suggestion = suggestions[n];
console.log("n="+n)
// line below outputs value of: undefined
console.log(" - suggestion className: "+suggestion.className);
// line commented out below is approx. what I'd like to have:
// const sKeyword = suggestion.dataset.keyword
} // next n
为 className 返回的值都是undefined。
我不认为这些对象是 DOM 节点!
顺便说一句:这些 DIV 具有相同的类名,但没有我事先知道的唯一 ID。
解决方案
不幸的是,page.evaluate()
类似的只能传输可序列化的值(粗略地说,JSON 可以处理的值)。由于await page.$$eval('.s-suggestion',(divs) => divs);
返回不可序列化的 DOM 元素集合(它们包含方法和循环引用),集合中的每个元素都被替换为空对象或undefined
. page.$$(selector)
您需要返回可序列化的值(例如,文本或属性数组)或使用类似ElementHandle
API。
对于您的情况,请尝试:
const keywords = await page.$$eval(
'.s-suggestion',
divs => Array.from(divs, div => div.dataset.keyword),
);
推荐阅读
- java - Arch 测试失败 STANDARD_STREAMS
- git - 运行 git pull 后显示许多已删除文件的 Git 状态
- node.js - 尝试通过 Windows 中的驱动器号访问网络共享时 ENOENT
- testing - 测试网络上设备之间的连接
- python - Python Flask_restplus flash_restx 动态编组响应
- windows - 在 Windows 上使用 RenderResolutionScale 属性创建 EGLSurface 失败
- spring-boot - 百里香表
- python - plotnine,当缺少值时,保持 geom_bar(position='dodge') 的相同位置
- javascript - 基于 GEO IP 的内容显示
- c# - 获取复选框 Item Asp.net core 的 Id