2015-12-09 5 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');

При сохранении цены выглядит следующим образом: "цена": «\ г \ п \ т \ т \ т \ т \ т \ т \ т \ t13,99 € \ т \ т \ т \ т \ т \ т \ т».

Я предполагаю, что это потому, что у вас много пробелов в 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-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:[email protected]') 
    .limit(10) 
    .write('data.json'); 

data.json выглядит, как показано ниже:

{"title": "PLAYERUNKNOWN'S BATTLEGROUNDS", 
"price": "$29.99"}, 
{"title": "PAYDAY 2: Ultimate Edition", 
"price": "$44.98"} 
Смежные вопросы