Я пытаюсь очистить и сохранить результаты в своей базе данных. Я использую NodeJS (фреймворк Sails.js)
Это рабочий пример использования cheerio:
getRequest('some-url').then((data) => {
const $ = cheerio.load(data);
let title = $('.title').each(function (i, element) {
let a = $(this);
let title = a.text(); // Title
MyModel.create({title : title}).exec((err, event) => {
});
});
});
Проблема с cheerio заключается в том, что он не действует как браузер и не отображает веб-страницы, отображаемые с помощью javascript.
Поэтому я решил попробовать кошмарный js, и это был кошмар, чтобы сделать то же самое:
var articles = [];
Promise.resolve(nightmare
.goto('some-url')
.wait(0)
.inject('js', 'assets/js/dependencies/jquery-3.2.1.min.js')
.evaluate((articles) => {
var article = {};
var list = document.querySelectorAll('h3 a');
var elementArray = [...list];
elementArray.forEach(el => {
article.title = el.innerText;
articles.push(article);
myModel.create({title : article.title}).exec((err, event) => {
});
});
return articles;
}, articles)
.end())
.then((data) => {
console.log(data);
});
Проблемы
Новости не определены внутри функции evaluate()
. функция оценки, похоже, принимает только строки, а Новости — это модель, созданная sails.js
.
Кроме того, массив статей заполняется теми же данными.
Есть ли более простой способ очистить веб-страницу после рендеринга DOM с помощью NodeJS?