我正在尝试从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');
});
});
}
});
答案 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');
});