Node.js - невозможно сохранить ожидаемые данные с помощью Cheerio - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь почистить веб-сайт, но у меня большая проблема с выводом.

Я могу sh восстановить имя на сайте, он находит мне данные, но когда Я пытаюсь сохранить это значение. Я могу сохранить только значение «ноль».

Я новичок в программировании, я не изучал обещания, обратные вызовы и асин c, но я думаю, что это сильно связанные с проблемой.

Это мой код Node.js, когда я использую .text()

const http = require('follow-redirects/http');
const https = require('follow-redirects/https');
const cheerio = require('cheerio');

https.get('https://www.example.com/search?q=' + entreprise, response => {
  response.on('data', chunk => {
    const $ = cheerio.load(chunk, {
      xmlMode : false
    });

    domaine = $('div#presentationlien.FichePresentation__link.mt-13 p.fs-12 a.Link').text()

    JSON.parse(JSON.stringify(domaine))

    console.log(domaine);

  });

}).on('error', err => {
  console.error(err);
});

HTML:

    ...
    <div id="synthese" class="break-word mt-29">
        <p class="fs-12">
            <a class="lien" href="/societe/renault-sas-780129987.html">RENAULT SAS</a>, soci&#xFFFD;t&#xFFFD; par actions simplifi&#xFFFD;e est active depuis 48 ans.<br>Localis&#xFFFD;e &#xFFFD; BOULOGNE-BILLANCOURT (92100), elle est sp&#xE9;cialis&#xE9;e dans le secteur d&apos;activit&#xFFFD; de la construction de v&#xFFFD;hicules automobiles. Son effectif comprends plus de 10 000 salari&#xE9;s.
        </p>


        <div id="presentationlien" class="FichePresentation__link mt-13"> 
            <p class="fs-12">Sur l&apos;ann&#xE9;e 2018 elle r&#xE9;alise un chiffre d&apos;affaires de <span class="synthesenumber">48333000000,00  EU</span>.</p>
            <p class="fs-12">Le total du bilan a augment&#xE9; de 0,97 % entre 2017 et 2018.</p>


            <p class="fs-12">Societe.com recense <a class="Link" href="#etab"><span id="synthnbetab" class="synthesenumber">219</span> &#xE9;tablissements <span id="synthnbetabexact"></span></a> et 4 <a class="Link" href="#event">&#xE9;v&#xE9;nements</a> notables depuis un an.</p>



            <p class="fs-12">
            <a class="Link" href="https://dirigeant.societe.com/dirigeant/Jean-Dominique.SENARD.69230073.html">Jean-Dominique SENARD</a>, est pr&#xFFFD;sident de la soci&#xFFFD;t&#xFFFD; RENAULT SAS.
            </p>



        </div>



    </div>
...

Данные, которые я хочу получить:

Жан-Доминик СЕНАР

<p class="fs-12">
            <a class="Link" href="https://dirigeant.societe.com/dirigeant/Jean-Dominique.SENARD.69230073.html">Jean-Dominique SENARD</a>, est pr&#xFFFD;sident de la soci&#xFFFD;t&#xFFFD; RENAULT SAS.
            </p>

Выходная консоль:

219 établissements événementsJean-Dominique SENARD

Но когда я пытаюсь сохранить данные «Жан-Доминик СЕНАР» в переменная, чтобы манипулировать ею, я не могу, потому что она возвращает "undefined" или "null".

Можете ли вы помочь мне? Спасибо.

Ответы [ 3 ]

1 голос
/ 22 января 2020

Я бы предложил использовать подход, основанный на обещаниях, это дает наиболее читаемый код IMHO.

Вы можете вернуть обещание из функции поиска.

Я бы также предложил использовать синтаксис async / await , это еще больше улучшит читабельность.

Получив результат, вы можете в дальнейшем манипулировать им в testGetRequiredData () ..

Вы также можете попробовать заменить строку:

domaine = $('div#presentationlien.FichePresentation__link.mt-13 p.fs-12 a.Link').text();

на

domaine = $('div#presentationlien.FichePresentation__link.mt-13 p.fs-12 a.Link').last().text();

This даст только имя (однако это может быть не так надежно!)

Например:

const cheerio = require('cheerio');
const http = require('follow-redirects/http');
const https = require('follow-redirects/https');

function getRequiredData(url) {
    return new Promise((resolve, reject) => {
        https.get(url, response => {
            response.on('data', chunk => {
                const $ = cheerio.load(chunk, { xmlMode : false });
                domaine = $('div#presentationlien.FichePresentation__link.mt-13 p.fs-12 a.Link').text()
                resolve(domaine);
            });
        }).on('error', err => {
            reject(err);
        });
    });
}

async function testGetRequiredData(entreprise) {
    try { 
        const url = `https://www.example.com/search?q=${entreprise}`;
        let result = await getRequiredData(url);
        // Do whatever you wish with the result..
        console.log("Result:", result);
    } catch (error) {
        console.error(`testGetRequiredData: An error occurred:`, error);
    }
}

// Replace the parameter here..
testGetRequiredData("put entreprise here!");
0 голосов
/ 22 января 2020

Спасибо всем за помощь, только найденный результат остается пустым ...

Спасибо, Терри, но что-то должно ускользнуть от меня в вашем коде, потому что вот результат консоли:

Вывод на консоль: ##

Result :


Я начал разрабатывать этот фрагмент кода, который приближает меня к тому, что я хочу, только я не могу передать результат переменной, еще одну историю обетования с узлом. ?

/ ядро ​​/ соскоб. js

exports.findLeader = (NUMBER) => {

    const Promise1 = new Promise(function (resolve, reject) {

        https.get('https://www.example.com/search?number=' + NUMBER, response => {
            response.on('data', chunk => {
                const $ = cheerio.load(chunk, {
                    normalizeWhitespace: true
                });

                $('p[class=fs-12] a[class=Link]').each((i, element) => {
                    let fdlinks = $(element).last().text();
                    resolve(liens.push(fdlinks));
                });

            });

        }).on('error', err => {
            return err;
        });

    });

    Promise1.then(function (value) {
    var lelien = liens[2]
    return lelien;
    });
}

Индекс. js

console.log(scraping.findLeader("780129987"));

Выход:

undefined

Д у тебя есть идеи как это сделать?

0 голосов
/ 22 января 2020

Есть 2 элемента с классом p.fs-12 a.Link. Поэтому, если вы хотите выбрать 2-й, вам следует использовать другие методы cheerio.

Также .text() используется для получения текстового значения из элемента html. Вам не следует использовать его, если вы хотите получить html сам элемент.

Запрос, который вам нужен:

$('div#presentationlien.FichePresentation__link.mt-13 p.fs-12 a.Link').eq(2).parent();
...