我找到了解决这个问题的三种解决方案,具体取决于提取的复杂程度。最简单的选项是我没有注意到的相关函数:page.$eval() https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevalselector-pagefunction-args。它基本上做了我想做的事情:结合page.$()
and page.evaluate()
。这是一个有效的示例:
const puppeteer = require('puppeteer');
puppeteer.launch().then(function(browser) {
browser.newPage().then(function(page) {
page.goto('https://stackoverflow.com/users/4794').then(function() {
page.$eval('h2.user-card-name', function(heading) {
return heading.innerText;
}).then(function(result) {
console.info(result);
browser.close();
});
});
});
});
这给了我预期的结果:
$ node get_user.js
Don Kirkby top 2% overall
我想提取一些更复杂的东西,但我终于意识到评估函数正在运行在页面的上下文中。这意味着您可以使用页面中加载的任何工具,然后只需来回发送字符串和数字。在此示例中,我在字符串中使用 jQuery 来提取我想要的内容:
const puppeteer = require('puppeteer');
puppeteer.launch().then(function(browser) {
browser.newPage().then(function(page) {
page.goto('https://stackoverflow.com/users/4794').then(function() {
page.evaluate("$('h2.user-card-name').text()").then(function(result) {
console.info(result);
browser.close();
});
});
});
});
这给了我一个空白完整的结果:
$ node get_user.js
Don Kirkby
top 2% overall
在我的真实脚本中,我想提取多个节点的文本,因此我需要一个函数而不是简单的字符串:
const puppeteer = require('puppeteer');
puppeteer.launch().then(function(browser) {
browser.newPage().then(function(page) {
page.goto('https://stackoverflow.com/users/4794').then(function() {
page.evaluate(function() {
return $('h2.user-card-name').text();
}).then(function(result) {
console.info(result);
browser.close();
});
});
});
});
这给出了完全相同的结果。现在我需要添加错误处理,也许还需要减少缩进级别。