Элемент Puppeteer является console.log'able, но возвращает undefined в кукловоде - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь просканировать веб-страницу, имеющую тег h3 под тегом a. Я получаю тег a нормально, но при попытке получить innerText из h3 я получаю значение undefined.

Это то, что я пытаюсь просканировать:

const puppeteer = require('puppeteer');
const pageURL = "https://producthunt.com";

const webScraping = async pageURL => {
    const browser = await puppeteer.launch({
        headless: false,
        arges: ["--no-sandbox"]
    });
    const page = await browser.newPage();
    let dataObj = {};

    try {
        await page.goto(pageURL, { waitUntil: 'networkidle2' });

        const publishedNews = await page.evaluate(() => {
            const newsDOM = document.querySelectorAll("main ul li");

            let newsList = [];
            newsDOM.forEach(linkElement => {
                const text = linkElement.querySelector("a").textContent;
                const innerText = linkElement.querySelector("a").innerText;
                const url = linkElement.querySelector("a").getAttribute('href');

                const title = linkElement.querySelector("h3").innerText;
                console.log(title);

                newsList.push({
                    title,
                    text,
                    url
                });
            });
            return newsList;
        });

        dataObj = {
            amount: publishedNews.length,
            publishedNews
        };

    } catch (e) {
        console.log(e);
    }

    console.log(dataObj);
    browser.close();
    return dataObj;
};

webScraping(pageURL).catch(console.error);

Консольный журнал работает отлично, но кукольник выдает:

Cannot read property 'innerText' of null

1 Ответ

0 голосов
/ 27 мая 2020

Похоже, ваше решение работает нормально, но вы не контролируете, является ли тег h3 нулевым или нет. Попробуйте добавить оператор if перед доступом к атрибуту innerText или используйте код, который я оставил ниже.

const puppeteer = require('puppeteer');
const pageURL = "https://producthunt.com";

const webScraping = async pageURL => {
    const browser = await puppeteer.launch({
        headless: false,
        arges: ["--no-sandbox"]
    });
    const page = await browser.newPage();
    let dataObj = {};

    try {
        await page.goto(pageURL, { waitUntil: 'networkidle2' });

        const publishedNews = await page.evaluate(() => {
            let newsList = [];
            const newsDOM = document.querySelectorAll("main ul li");

            newsDOM.forEach(linkElement => {
                const aTag = linkElement.querySelector("a");

                const text = aTag.textContent;
                const innerText = aTag.innerText;
                const url = aTag.getAttribute('href');

                let title = aTag.querySelector("h3");
                // there may be some <a> without an h3, control
                // the null pointer exception here, accessing only
                // if title is not 'null'.
                if (title) title = title.innerText;

                console.log(title);

                // changed the object structure to add a key for each attr
                newsList.push({
                    title: title,
                    text: text,
                    url: url
                });
            });

            return newsList;
        });

        // changed the object structure to add a key for the array
        dataObj = {
            amount: publishedNews.length,
            list: publishedNews
        };

    } catch (e) {
        console.log(e);
    }

    console.log({receivedData: dataObj});
    browser.close();
    return dataObj;
};

webScraping(pageURL).catch(console.error);

Сообщите мне, решит ли это вашу проблему!

...