【发布时间】:2018-10-08 21:23:11
【问题描述】:
我在node.js 中编写了一个脚本来从网页中抓取不同标题的links。当我执行以下脚本时,我在控制台中打印了undefined,而不是我所追求的links。我定义的选择器是准确的。
我不希望将links 放入一个数组并返回结果;相反,我希望即时打印它们。由于我是使用node.js 和puppeteer 组合编写脚本的新手,所以我无法弄清楚我正在犯的错误。
这是我的脚本 (Link to that site):
const puppeteer = require('puppeteer');
function run () {
return new Promise(async (resolve, reject) => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://stackoverflow.com/questions/tagged/web-scraping");
let url = await page.evaluate(() => {
let items = document.querySelectorAll('a.question-hyperlink');
items.forEach((item) => {
//would like to keep the following line intact
console.log(item.getAttribute('href'));
});
})
browser.close();
return resolve(url);
} catch (e) {
return reject(e);
}
})
}
run().then(console.log).catch(console.error);
如果我考虑声明一个空数组
results并将抓取的链接存储在其中并最终返回results,则以下脚本可以正常工作,但我不希望这样。我想坚持我上面尝试的方式,就像即时打印结果一样。
const puppeteer = require('puppeteer');
function run () {
return new Promise(async (resolve, reject) => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://stackoverflow.com/questions/tagged/web-scraping");
let urls = await page.evaluate(() => {
let results = [];
let items = document.querySelectorAll('a.question-hyperlink');
items.forEach((item) => {
results.push({
url: item.getAttribute('href'),
});
});
return results;
})
browser.close();
return resolve(urls);
} catch (e) {
return reject(e);
}
})
}
run().then(console.log).catch(console.error);
再说一次:我的问题是如何在不将其存储在数组中的情况下即时打印console.log(item.getAttribute('href')); 之类的链接?
【问题讨论】:
-
哪个控制台日志调用提供
undefined打印?例如,url变量将始终未定义,因为您没有返回任何内容。
标签: node.js web-scraping promise puppeteer