【发布时间】:2020-09-26 17:07:15
【问题描述】:
我正在使用 Puppeteer 在 Typescript 中开发一个网络爬虫,并制作了一个这样的辅助函数:
function evaluateXPath(page: puppeteer.Page, xpath: string): Promise<any[]> {
return page.waitForXPath(xpath)
.then(() => page.$x(xpath))
.then(handles => page.evaluate((...handles) => handles.map(h => h.href), ...handles))
}
如果我想获取 xpath 的 href 字段的值,它可以正常工作,但我想让它更通用。像这样(用 'evalFunc' 替换 map() 中的 'h => h.href'):
function evaluateXPath(page: puppeteer.Page, xpath: string, evalFunc: (value: any, index: number, array: any[]) => any): Promise<any[]> {
return page.waitForXPath(xpath)
.then(() => page.$x(xpath))
.then(handles => page.evaluate((...handles) => handles.map(evalFunc), ...handles))
}
这显然不起作用,因为 'evalFunc' 在浏览器上下文中不存在,但是将函数传递给浏览器的任何尝试都会失败或无法编译。将它传递到 evaluate() 函数内不起作用,因为它不能分配给“SerializableOrJSHandle”类型的参数,而且我对exposeFunction() 函数也没有运气。
谁能告诉我它是怎么做的?
【问题讨论】:
-
您使用
handles执行什么样的操作? -
如果你不介意在page.evaluate中写出来,你可以把
window.nameMe = function() {}放在evaluate函数中。除非我误解了你的问题... -
我希望能够传递任意函数(在 c 的限制下,例如获取 href/innerText 并偶尔制作一个简单的 if-case)以在浏览器上下文中进行评估。必须在辅助函数中定义我打算使用的每个函数会很不方便且难以维护。
标签: javascript node.js typescript xpath puppeteer