X Ray Scraper:在.write之前处理数据

时间:2015-12-09 10:05:57

标签: scrape x-ray

我正在摆弄一些抓取,并且需要在将其写入我的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;
&#13;
&#13;

所以我的问题是:是否可以在.write之前操作数据?

2 个答案:

答案 0 :(得分:3)

是的,您可以简单地提供一个回调函数,该函数接收一个刮擦结果的对象。在此功能中,您可以完全控制您想要执行的任何后处理。

所以你的代码最终会像:

&#13;
&#13;
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;
&#13;
&#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"}