Nodejs Функция Webscraping с использованием Cheerio возвращается до завершения - PullRequest
0 голосов
/ 22 марта 2020

В настоящее время я работаю над простой веб-программой nodejs. Он основан на cheerio, и я получаю элементы с веб-сайта и извлекаю оттуда некоторую информацию.

Насколько я понимаю, все функции, которые я вызываю внутри foreach l oop, являются syn c, поэтому они должны выполнить сверху вниз. И поскольку foreach l oop также является только нормальным l oop, который выполняет syn c в js, функция должна вернуть мой законченный массив. Но вместо этого он становится неопределенным, и когда я захожу в него непосредственно на консоль, он работает (?).

function getIntensiv(){
    var intensivregister = [];
    request.post({url: 'SOMEURL', form: {SOMEFORM}}, function(err,res,body){
        var $ = cheerio.load(body);
        $('#dataList').children('tbody').children('tr').each(function(i, elem){
            var name = $(elem).children('td').first().text().trim().split("\n")[0].trim();                        
            var zipcity = $(elem).children('td').first().children('small').last().text();                         
            var streetnr = $(elem).children('td').first().children('br').last().prev().text();                    
            intensivregister.push({'name': name, 'zipcity': zipcity, 'streetnr': streetnr});
        });
        console.log(intensivregister);  //works and prints the finished array
        return intensivregister;        //returns undefined before function finished
    });
}

Буду признателен, если вы объясните мне, где моя ошибка, и поможете исправить ее.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Хорошо, я понял, что моя идея javascript была не в том, как вы должны ее использовать. Я обошел свою проблему с избавлением от идеи возврата значений из функций (что происходит в основном из моего опыта программирования asyn c) и вместо этого использовал параметры обратного вызова, которые я даю своей функции и вызываю в конце моего запроса.

function getIntensiv(callback){
    var intensivregister = [];
    request.post(...);
    **callback(intensivregister);**
}

То, что также работает (и я думаю, что лучшее решение), работает с обещаниями, например, с запросом-обещанием и вызовом обратного вызова в вызове finally .

0 голосов
/ 22 марта 2020
function getIntensiv(){
const cheerio = require('cheerio')
const request = require('request')

var intensivregister = [];
request.get({url: 'https://www.w3schools.com/html/html_tables.asp'}, function(err,res,body){


var $ = cheerio.load(body);

    $('#customers').children('tbody').children('tr').each(function(i, elem){
        var name = $(elem).children('td').first().text().trim().split("\n")[0].trim();                        
        var zipcity = $(elem).children('td').first().children('small').last().text();                         
        var streetnr = $(elem).children('td').first().children('br').last().prev().text();                    
        intensivregister.push({'name': name, 'zipcity': zipcity, 'streetnr': streetnr});
    });
    console.log(intensivregister);  //works and prints the finished array
    return null;        //returns undefined before function finished
});
return null;   //***<---This is returning and not the above return. If no return statement is written then undefined is passed.***
};

var retrunVal = getIntensiv()
console.log(retrunVal);

Пожалуйста, найдите выделенный комментарий

...