我正在摆弄一些抓取,并且需要在将其写入我的json文件之前操纵一些数据。
var Xray = require('x-ray');
var x = Xray();
x('http://myUrl.com', '#search_results div div a', [{
title: '.responsive_search_name_combined .search_name .title',
price: '.col.search_price.responsive_secondrow',
}])
.paginate('.search_pagination_right a.pagebtn:last-child@href')
.limit(10)
.write('data.json');

保存后,价格如下:"价格":" \ r \ n \ t \ t \ t \ t \ t \ t \ t \ t \ t \ tT,9,9€\ t \ t \吨\吨\吨\吨\吨\吨"
我猜它是因为div.col.search_price.responsive_secondrow中有很多空格。
<div class="col search_price responsive_secondrow">
9,99€ </div>
&#13;
所以我的问题是:是否可以在.write之前操作数据?
答案 0 :(得分:3)
是的,您可以简单地提供一个回调函数,该函数接收一个刮擦结果的对象。在此功能中,您可以完全控制您想要执行的任何后处理。
所以你的代码最终会像:
x('http://myUrl.com', '#search_results div div a', [{
title: '.responsive_search_name_combined .search_name .title',
price: '.col.search_price.responsive_secondrow',
}])
(function(products){
var cleanedProducts = [];
products.forEach(function(product){
var cleanedProduct = {};
cleanedProduct.price = product.price.trim();
//etc
cleanedProducts.push(cleanedProduct)
});
//write out results.json 'manually'
fs.writeFile('results.json', JSON.stringify(cleanedProducts));
})
&#13;
答案 1 :(得分:0)
您可以使用X-Ray原生支持的方法,称为filter
函数,并完全覆盖您描述的情况。
filters
是自定义函数,允许您在处理抽取数据时实现自定义逻辑。
请参阅下面的代码示例。有一个名为cleanUpText
的自定义过滤器函数,并将其应用于已删除的数据price
。
var Xray = require('x-ray');
var x = Xray({
filters: {
cleanUpText: function (value) { return value.replace('\r\n\t\t\t\t\t\t\t\t', '').replace('\t\t\t\t\t\t\t', ''); },
}
});
x('http://store.steampowered.com/search/?filter=topsellers', '#search_results div div a', [{
title: '.responsive_search_name_combined .search_name .title ',
price: '.col.search_price.responsive_secondrow | cleanUpText', // calling filter function 'cleanUpText'
}])
.paginate('.search_pagination_right a.pagebtn:last-child@href')
.limit(10)
.write('data.json');
data.json
如下所示:
{"title": "PLAYERUNKNOWN'S BATTLEGROUNDS",
"price": "$29.99"},
{"title": "PAYDAY 2: Ultimate Edition",
"price": "$44.98"}