从node.js解析HTML时如何确定URL

时间:2018-01-02 07:16:57

标签: javascript html node.js request

我正在使用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?

感谢您的任何建议!

1 个答案:

答案 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变量

使用闭包有时会很危险,因为你可能会有内存泄漏(当闭包指向外部的东西时,某些东西从外部点指向闭包中的东西)