我正在使用node.js
打开网页列表并解析HTML
内容。
我将脚本中的URL作为数组提供,然后调用请求以检索HTML
,然后我将其与Cheerio进行解析。
我遇到的问题是某些网页没有列出HTML
内容中的网址。
所以我想确定我在请求回调中解析的页面的URL。
由于请求是异步的,我不能依赖外部循环(循环遍历URL字符串数组)来获取URL。
有什么想法吗?
var requestList = [ 'https://blahblah.com', 'https://blah2.com' ];
for (var i = 0; i < (requestList.length); i++) {
request(requestList[i], function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
...
// how can i determine the URL of this html body?
感谢您的任何建议!
答案 0 :(得分:3)
您可以改为使用#Array.forEach并使用闭包来捕获网址
requestList.forEach((url)=>{
request(url, (err,res,html) => {
console.log(url)
// rest of code here...
});
});
为什么会这样?
Closure捕获所有引用(当前闭包可以通过作用域到达)。它是一个有自己记忆的功能(种类)
例如,让我们来看看这段代码 你也可以用循环来做到这一点:
for (var i = 0; i < (requestList.length); i++) {
handleRequest(requestList[i]);
}
function handleRequest(url) {
// scope a
request(url, function (error, response, html) {
// scope b, (closure)
console.log(url);
// rest of the code
})
}
由于scope b
捕获了它可以达到的值,它会记住URL
变量
使用闭包有时会很危险,因为你可能会有内存泄漏(当闭包指向外部的东西时,某些东西从外部点指向闭包中的东西)