2017-01-09 1 views
0

In ein wenig Ausfallzeit von der Arbeit habe ich mich entschieden, mit Daten-Scraping und JSON nur für ein bisschen Spaß herumzualbern. Also habe ich eine Dummy-Seite auf meiner Seite eingerichtet, die alle x Minuten einen Song-Namen und einen Künstler ändert und einen Scraper erstellt, um die Seite abzuziehen und in eine JSON-Datei zu schreiben. So weit, ist es gut. Mein Skript zieht die Daten von der Seite, wenn es sinnvoll ist, und schreibt sie in eine JSON-Datei, aber das Zurückkommen ist ungültig. Worauf ich hinaus will ist dieseErstellen einer gültigen JSON-Datei aus gezogenen Daten

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

Und was ich will, ist eher wie dieses

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

Das die js ist, die die Daten zieht:

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); 
     }; 
     }); 
    }); 
    }); 

Jede Hilfe wird sehr geschätzt, Vielen Dank!

+1

Ich habe nach einer Lösung gesucht, aber da ich nicht wirklich weiß, wonach ich suchen soll, kam ich hierher, um in die richtige Richtung zu gehen. – Damien

Antwort

0

Sie sollten ein leeres Objekt erstellen, um dann mit .each() das DOM-Element zu iterieren und gewünschte Eigenschaften zu erstellen, d. H. response1, response2.

Die schließlich .appendFileSync() verwenden, um Daten einmal nach Iteration zu senden.

//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); 
    }; 
}); 
+0

Danke für dieses @Satpal, habe gerade eine schnelle Änderung daran gemacht, dass es an meinem Ende funktioniert :) – Damien

+0

@Damien, Es gab einen Tippfehler auf meiner Seite bearbeitet die Antwort – Satpal

Verwandte Themen