2

nodejs とその 2 つのモジュール request と Cheerio を使用して Web サイトをスクレイピングする単純な Web アプリを構築しようとしています。

私は次のコードでそれを行うことができます:

    var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);

            $('img').each(function(){
                console.log($(this).attr('src'));
            });

        }
    } )());
};

Web サイト上の写真の URL を印刷することは問題なく機能しますが、ここで実際に実行しようとしているのは、関数の外部で使用できる URL のリストを作成することです。この方法で試しましたが、空のリストが返されます:

var urlList=[];     
var printURL=function(url){
        request(url, (function() {
            return function(err, resp, body) {
                if (err)
                    throw err;
                $ = cheerio.load(body);

                $('img').each(function(){
                    urlList.push($(this).attr('src'));
                });

            }
        } )());
    };

どうすればこれを修正できますか? どうもありがとう

4

1 に答える 1

3

すべてのコールバックが完了するまで待つ必要があります。

var urlList=[];     
var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);
            var images = $('img');
            var counter = images.length;
            images.each(function(){
                urlList.push($(this).attr('src'));
                counter--;
                if (counter==0) {
                    // now we have all images!!
                    console.log(urlList);
                }
            });

        }
    })());
};

これは、node.js の非同期の性質の一部です。さらに複雑な場合は、asyncなどのフロー制御ライブラリを使用することをお勧めします。

于 2014-02-27T15:28:14.477 に答える