2017-04-01 9 views
0

私はNode.jsで手をかけています。私は、ページをスキャンし、すべてのリンクをjsonファイルに戻す単純なクローラを構築したいと考えています。しかし、スクリプトを実行すると、0のリンクが返されます。ここでノード.JSクローラからJSONへの出力が空です

は、その全体が私のコードです:

var request = require('request'); 
    var cheerio = require('cheerio'); 
    var fs = require("fs"); 

    var url = 'https://stackoverflow.com/questions'; 

    //Create the blank array to fill: 
    var obj = { 
     table: [] 
    }; 

    var i = 0; 

    request(url, function(err, resp, body){ 
     $ = cheerio.load(body); 
     links = $('a'); //jquery get all hyperlinks 

     $(links).each(function(i, link){ 
     var actualLink = $(link).attr('href'); 
      obj.table.push({id: i, url:actualLink}); //add some data 
      i++; 
     }); 

    }); 

    var json = JSON.stringify(obj); 

    console.log(json); 

の端子で出力がそうである:

$ !!

ノードが

{ "テーブル":[]} nodetest.js

を、これは空白になって、なぜ誰もが見ることができますか?あなたは内部obj要求の成功コールバックを使用する必要があります

答えて

1

ファイル:)に、最終的なJSONを書くためのボーナスポイントは、それはそれが移入取得する場所です:あなたのコードで

request(url, function(err, resp, body) { 
    $ = cheerio.load(body); 
    links = $('a'); //jquery get all hyperlinks 

    $(links).each(function(i, link) { 
     var actualLink = $(link).attr('href'); 
     obj.table.push({id: i, url:actualLink}); //add some data 
    }); 

    // Only here you can be sure that the "obj" variable is properly 
    // populated because that's where the HTTP request completes 
    var json = JSON.stringify(obj); 
    console.log(json); 
}); 

あなたが置かれていますconsole.logは要求の成功の外側で非同期なので、obj変数にはまだ値が設定されていません。

i変数は必要ありません。それは自動的にeachコールバックに渡されます。明示的に宣言またはインクリメントする必要はありません。

限り結果をファイルに書き込むことが関係しているとして、あなたはfs.writeFile機能を使用できます。

fs.writeFile("/tmp/test", json, function(err) { 
    if(!err) { 
     console.log("File successfully saved"); 
    } 
}); 
+0

をこれは買いが、その後何もしなかった成功したファイルを言います。私は "/ tmp/test"を "test.json"に変更しました。 – JamesG

関連する問題