Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Parse. Cheerio. Подскажите. Не могу сохранить все элементы. Только последний. (https://javascript.ru/forum/node-js-io-js/78941-parse-cheerio-podskazhite-ne-mogu-sokhranit-vse-ehlementy-tolko-poslednijj.html)

Vlad_972 25.11.2019 09:27

Parse. Cheerio. Подскажите. Не могу сохранить все элементы. Только последний.
 
Все привет. Парни, я тут новенький и в целом это не мой профиль. Подскажите где я что-то делаю не так?
Есть функция чтобы сграбить с web данные. Использую cheerio.
Хочу сохранить все в Parse. Но сохраняется только один последний элемент. Видимо он перезаписывается постоянно.

async function first() {
    try {
        request('SOME_WEB_HTTPS_PAGE', (error, response, html) => {
           $createNewName = new NameObj();
            if(!error && response.statusCode == 200) {
                const $ = cheerio.load(html);
        
                    $('.catalog-products-list div').each((i, el) => {                         

                        async function asyncParallel() {
                            const elem = $(el);
                            try {
                              let [val1] = await Promise.all([get1(elem)]);
                              if(`${val1}` != `undefined`) {

                                let correct = await Promise.all([saveData(`${val1}`)]);
                              }
                            } catch(err) {
                              console.log(err)
                            }
                          }

                          asyncParallel();
                        
                    });
                };
                function saveData(name) {
                    
                    newData.set("name", name)
                    newData.save()
                    .then(function() {
                            console.log("all saved");
                        }, function(error) {
                            console.log(error);
                        });
                }

                function get1(elem) {
                    const newName = elem.attr('name');
                    if(newName != undefined) {
                        return newName
                    }                 
                }                          
        });
    } catch(err) {
        console.log(err);
    }
};

Буду благодарен за подсказку. Спасибо.

рони 25.11.2019 09:33

Vlad_972,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Audaxviator 25.11.2019 15:55

Не понятно, чего вы хотите.
В cherio нет никакой асинхронности. Вот в этой строчке
$('.catalog-products-list div').each((i, el) =>
она начинает перебирать все элементы, которые уже не строки, это уже объекты. И пока этот цикл не закончит работать, дальше ничего делаться не будет.
Просто объявите пустой массив перед циклом, добавляйте методом push в этот массив в цикле всё, что вы из них хотите, цикл закончит работу - и после него вы получите готовый массив.
Ну... вот так в массиве будут значения всех атрибутов href из дивов внутри элементов с классом .catalog-products-list
var arr = [];
$('.catalog-products-list div').each((i, el) => {
  arr.push($(el).attr('href'));
})
console.log(arr);

Vlad_972 25.11.2019 16:18

Благодарю за ответ. Сохранения объекта в Parse требует дописывать обработчик, без него выпадают ошибки. С массивом понятно, а как быть если у меня не одно значение которое надо извлечь? Если у меня там длинный список типа id, name, image.... и тд.

Audaxviator 25.11.2019 16:38

Я опять не понял про Parse. Но не важно.
Это всё обычный javascript без закидонов. Делайте что хотите. Вот так - на выходе получится объект (ну типа map) с ключами в виде айдишников и значениями в виде подобъектов с атрибутами href под ключами 'href'
var obj = {};
$('.catalog-products-list div').each((i, el) => {
  var ob = {};
  ob['href'] = $(el).attr('href');
  obj[$(el).attr('id')] = ob;
});

И дальше можно перебрать этот готовый объект, разглядывая айдишники и соответствующие им хрефы.
Object.keys(obj).forEach(function(id) {
  console.log(id, obj[id]['href']); // здесь
});

Vlad_972 25.11.2019 16:44

Цитата:

Сообщение от Audaxviator (Сообщение 516159)
Я опять не понял про Parse. Но не важно.
Это всё обычный javascript без закидонов. Делайте что хотите. Вот так - на выходе получится объект (ну типа map) с ключами в виде айдишников и значениями в виде подобъектов с атрибутами href под ключами 'href'
var obj = {};
$('.catalog-products-list div').each((i, el) => {
  var ob = {};
  ob['href'] = $(el).attr('href');
  obj[$(el).attr('id')] = ob;
});

И дальше можно перебрать этот готовый объект, разглядывая айдишники и соответствующие им хрефы.
Object.keys(obj).forEach(function(id, subobj) {
  console.log(id, subobj['href']);
});

Большое спасибо. Пойду делать. Спасибо) Хорошего дня.

Audaxviator 25.11.2019 17:19

Ой. Я там исправил.

Vlad_972 25.11.2019 17:51

Цитата:

Сообщение от Audaxviator (Сообщение 516166)
Ой. Я там исправил.

отлично! Спасибо!

Vlad_972 26.11.2019 06:48

Цитата:

Сообщение от Vlad_972 (Сообщение 516160)
Большое спасибо. Пойду делать. Спасибо) Хорошего дня.

танцы с бубнами... не фига не работает. Дело не в коде. Сохранение в Parse Server не получается так как мне нужно. Нужно чтобы сохранял по строчно, а он гад, либо сохраняет только последний элемент из цикла, либо массив. Пробовал создать простой цикл перебора и запхал туда функцию сохранения, все равно только последний элемент. При этом если из перебора элементы запихивать в массив потом массив целиком сохранить - то сохраняет) но если перебирать массив и сохранять каждый элемент - опять не фига)))

Vlad_972 26.11.2019 10:25

Всем большое спасибо за помощь) Я все же решил задачу)) Хорошего дня!)


Часовой пояс GMT +3, время: 07:02.