来自节点Scrape的书面文件不正确

时间:2014-09-23 18:28:07

标签: javascript jquery json node.js

我正在尝试从madeinnyc技术地图中提取名称,地址和网址,以获取学习如何使用mapbox的个人项目。在这个过程中,我想抓取列表并将它们导出到我可以用于项目的json文件中。我遇到的问题是信息没有正确写入json文件。当我在控制台中记录报废数据时,我收到了正确的格式和所有数据,但报废数据中的书面文件不正确,只收到一个随机数据。我认为当前的设置是抓取单个部分并多次覆盖它,因为我在控制台中收到多个File Success日志。我的writeFile方法不正确吗?

以下是记录在控制台console.log(metadata)的信息(正确的数据,因为您了解了其余的列表,因此会缩小):

{ name: 'Todayships',
  address: '4447 Seton Ave 2',
  url: 'http://todayships.com/' }
{ name: 'Togather',
  address: '45 Main St Suite 404',
  url: 'http://www.togather.com' }
{ name: 'Tomorrow Networks, LLC',
  address: '1270 Avenue of the Americas 2920',
  url: 'http://www.tomorrownetworks.com' }
{ name: 'Topi',
  address: '20 W 20 Street 2nd Floor',
  url: 'http://topi.com' }

output.json

{
    "name": "Berlinica Publishing LLC",
    "address": "255 West 43rd Street Suite 1012",
    "url": "http://www.berlinica.com"
}s.com"
}ackground.html"
}drianyc.com/ersp.html"
}

scrape.js

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

request('http://mappedinny.com/', function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);

    $('li').each(function(i, element){

        var li = $(this)


        var name = li.attr('data-name');
        var address = li.attr('data-address');
        var url = li.attr('data-url');


        var metadata = {
            name : name,
            address : address,
            url : url
        };
        console.log(metadata);

        fs.writeFile('output.json', JSON.stringify(metadata, null, 4), function(err){
                console.log('File Success');
        });

    });
  }
});          

1 个答案:

答案 0 :(得分:0)

问题是你在同步循环(你的each())中异步写入同一个文件。

如果您打算将所有结果写入同一文件,您可以尝试:

var results = [];

$('li').each(function(i, element){

  var li = $(this)

  var name = li.attr('data-name');
  var address = li.attr('data-address');
  var url = li.attr('data-url');


  var metadata = {
    name : name,
    address : address,
    url : url
  };
  console.log(metadata);

  results.push(metadata);

});

fs.writeFile('output.json', JSON.stringify(results, null, 4), function(err){
  if (err)
    console.log('File Error: ' + err);
  else
    console.log('File Success');
});