2015-12-09 65 views
1

我正在摆弄一些刮擦,并且在将它写入我的json文件之前需要处理一些数据。X Ray Scraper:在处理数据之前处理数据.write

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:[email protected]') 
 
    .limit(10) 
 
    .write('data.json');

保存时,价格是这样的: “价格”:“\ r \ n \ t \ t \ t \ t \ t \ t \ t \ t13,99€\牛逼\ t \ t \ t \ t \ t \ t”的。

我猜是因为在div.col.search_price.responsive_secondrow中有很多空格。

<div class="col search_price responsive_secondrow"> 
 
\t \t \t \t \t \t \t \t 9,99€ \t \t \t \t \t \t \t </div>

所以我的问题是:有没有可能.WRITE前操纵数据?

回答

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)); 
 
})

0

你可以使用X射线原生支持的方法被称为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:[email protected]') 
    .limit(10) 
    .write('data.json'); 

data.json看起来象下面这样:

{"title": "PLAYERUNKNOWN'S BATTLEGROUNDS", 
"price": "$29.99"}, 
{"title": "PAYDAY 2: Ultimate Edition", 
"price": "$44.98"}