我正在进行网页抓取,并且网站在获取请求时返回如下字符串:
jQuery18305426675335038453_1429531451051({"d":[{"__metadata":"cool"}]})
完整代码在这里:
var baseUrl = "http://SOMEURL.COM?spatialFilter=nearby(52.47952651977539,-1.911009430885315,400)&$select=*&$top=200&$format=json&key=AjF8l9J6TH-WM5tkfFYdYE8NVUx9SFe4ya9aBaxKFFPBImvFWWHPOsRMSBesWblU&jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1";
var casper = require('casper').create({
verbose: false,
logLevel: 'debug',
pageSettings: {
loadImages: false,
loadPlugins: false
}
});
var fs = require('fs'),
shopInfo,
savePath,
date = new Date(),
secondsNow = date.getSeconds(),
day = date.getDate(),
minute = date.getMinutes();
month = date.getMonth() + 1,
fname = 'virginmedia-'+month+'-'+day+'-'+minute+'-'+secondsNow+'.txt';
function saveToFile(finalData) {
savePath = fs.pathJoin(fs.workingDirectory,
'output',fname);
fs.write(savePath, finalData, 'w');
}
casper.start(baseUrl, {
method: 'get',
headers: {
'Accept': 'application/json'
}});
casper.then(function getData(){
var rawData = this.getPageContent();
shopInfo = rawData;
shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
shopInfo = shopInfo.replace(/\)$/,'');
shopInfo = JSON.parse(shopInfo);
var resultPack = shopInfo.d.results;
var finalData = resultPack.map(function(val){
return [
val.Latitude,
val.Longitude,
val.EntityStoreName
];
});
saveToFile(JSON.stringify(finalData));
casper.echo("\n Hello! I just returned " + finalData.length
+ " shops");
});
casper.run();
换句话说,函数调用中的有效 json!。但我需要 JSON 部分。
在浏览器内部,我可以轻松地构造一个具有相同名称的函数,该函数返回其自己的参数:
function jQuery18305426675335038453_1429531451051() {
return arguments[0];
}
但在 casperjs 中它不起作用。所以我的最后一个选择是使用正则表达式来获取 JSON 字符串:
shopInfo = shopInfo.replace("jQuery18305426675335038453_1429531451051(",'');
shopInfo = shopInfo.replace(/\)$/,'');
有没有更好的方法?
编辑 1: 从评论中我发现它实际上是 JSONP,而不是 JSON,生活变得轻松!我从here找到了我的答案在搜索 JSONP 后。
编辑 2: 在评论中找到的另一个解决方案:通过更改请求,网站自行返回正确的 JSON!
最佳答案
阅读评论后,答案如下:
该格式称为 JSONP,或带填充的 JSON。它在 here 中的 SO 中进行了讨论
实际上没有必要这样做,可以更改 HTTP 请求以使其返回真实的 JSON 数据。只需从请求中删除这部分即可:
jsonp=jQuery18305426675335038453_1429531451051&_=1429532300821%20HTTP/1.1
关于javascript - 将字符串清理为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29763922/