Bri*_*ssy 3 javascript headless node.js phantomjs puppeteer
我正在使用phantomJs来解析一些内容,从中获取一些信息(例如页面上的最大图像大小)等。我决定转向puppeteer。我遇到了这个问题 - 在我的函数中,它在 phantomJs 上运行,它们正在处理文档节点元素。因此,在 puppeteer 中,据我所知,不可能从 page.evaluate 和其他函数返回节点元素。那么,有没有其他方法可以克服这个问题呢?或者也许我必须使用另一个图书馆?谢谢!
使用 Puppeteer 时需要考虑两种环境:
Node.js 环境建立在 Google 的 Chrome V8 JavaScript 引擎之上。
Chrome V8 描述了它与 DOM 的关系:
JavaScript 最常用于浏览器中的客户端脚本,例如用于操作文档对象模型 (DOM) 对象。然而,DOM 通常不是由 JavaScript 引擎提供,而是由浏览器提供。V8 也是如此——谷歌浏览器提供了 DOM。然而,V8 确实提供了 ECMA 标准中指定的所有数据类型、运算符、对象和函数。
换句话说,默认情况下不向 Node.js 提供 DOM。
这意味着 Node.js 没有能力自行解释 DOM 元素。
这就是 Puppeteer 的用武之地。
Puppeteer 函数page.evaluate()允许您使用 Chrome 或 Chromium 评估当前页面 DOM 上下文中的表达式。
该木偶文档描述了当您试图返回一个非序列化的价值,就像一个DOM元素会发生什么:
如果传递给 的函数
page.evaluate返回一个不可序列化的值,则page.evaluate解析为undefined。
同样,这是因为 Node.js 不知道如何在没有帮助的情况下解释 DOM 元素。
因此,Puppeteer 实现了一个ElementHandle表示页面内 DOM 元素的类。
您可以使用elementHandle.$()、elementHandle.$$()或elementHandle.$x()将ElementHandles 返回到 Node.js。
该ElementHandle班是序列化的,所以它可以在Node.js的环境中正确解释。
因此,如果你需要直接操作一个元素,你可以在page.evaluate(). 如果您需要访问元素的表示,请使用page.$()或其相关功能之一。