从提取的数据创建有效的JSON文件

时间:2017-01-09 09:44:34

标签: javascript json node.js

在一段时间的工作停机时间我决定搞乱数据抓取和JSON只是为了一点乐趣。所以我在我的网站上设置了一个虚拟页面,每隔x分钟更改一个歌曲名称和艺术家,并创建一个刮刀来拉出页面并写入JSON文件。到现在为止还挺好。我的脚本正在从页面中提取数据并将其写入JSON文件,但它的返回无效。我得到的是这个

{
    "trackName": "Feels So Close",
    "artistTitle": "Calvin Harris",
    "playTime": "9:24"
}{
    "trackName": "",
    "artistTitle": "Studio B",
    "playTime": "9:28"
}

我想要的更像是这个

{
    "response1": {
        "trackName": "Feels So Close",
        "artistTitle": "Calvin Harris",
        "playTime": "9:24"
    },
    "response2": {
        "trackName": "",
        "artistTitle": "Studio B",
        "playTime": "9:28"
    }
}

这是拉取数据的js:

  request("mySite", function(error, response, body) {
    if(error) {
      console.log("Error: " + error);
    }

    console.log("Status code: " + response.statusCode);

    var $ = cheerio.load(body);

    $('.track').each(function(index){
      var json = { trackName: "", artistTitle: "", playTime: ""};

      var title = $(this).find(".track a").text().trim();
      var artist = $(this).find(".artist").text().trim();
      var hours = new Date().getHours();
      var mins = new Date().getMinutes();

      json.trackName = title;
      json.artistTitle = artist;    
      json.playTime = hours + ":" + mins;

      fs.appendFileSync('trackList.json', JSON.stringify(json, null, 4), function(error){
        if(error) {
          console.log('Error: ' + error);
        };
      });
    });
  });

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

您应该创建一个空对象,然后使用.each()迭代DOM元素并创建所需的属性,即response1, response2

最后使用.appendFileSync()在迭代后发送一次数据。

//Create empty object
var json = {};   

//Iterate to create complete JSON object
$('.track').each(function(i){
    var title = $(this).find(".track a").text().trim();
    var artist = $(this).find(".artist").text().trim();
    var hours = new Date().getHours();
    var mins = new Date().getMinutes();

    //Create property object
    json['response' + i] = {
        trackName : title;
        artistTitle : artist;    
        playTime : hours + ":" + mins;
    };
});

//Then send it to update
fs.appendFileSync('trackList.json', JSON.stringify(json, null, 4), function(error){
    if(error) {
      console.log('Error: ' + error);
    };
});