Скрипт не может дать желаемый результат - PullRequest
0 голосов
/ 21 октября 2018

Я написал скрипт на node.js в сочетании с puppeteer, чтобы очистить первые title от нескольких постов на веб-странице.Когда я выполняю свой следующий скрипт, он не получает никаких результатов и не выдает никакой ошибки.

Это моя попытка:

const puppeteer = require('puppeteer');
const url = "https://stackoverflow.com/questions/tagged/web-scraping";

(async function main() {
    const browser = await puppeteer.launch();
    const page    = await browser.newPage();
    page.on('console', obj => console.log(obj._text));
    await page.goto(url);
    await page.waitForSelector('.question-hyperlink');
    await page.$(() => {
        let item = $eval('.question-hyperlink').innerText;
        console.log(item);
    })
    await browser.close();
})();

Хотя я знаю, чтоесли я внесу следующие изменения в мой скрипт выше, он будет работать.Тем не менее, я хотел бы придерживаться способа, который я попробовал выше, чтобы понять, как работает .$eval() в этом самом случае.

await page.evaluate(() => {
    let item = document.querySelector('.question-hyperlink').innerText;
    console.log(item);
})

1 Ответ

0 голосов
/ 21 октября 2018

page.$(selector) означает , что вы хотите получить дескриптор первого элемента с указанным селектором, но вы не дали ему никакого селектора, поэтому он не будет работать.

Вместо этого вы можете получить дескриптор необходимого элемента:

const link = await page.$('.question-hyperlink');

Затем получите дескриптор необходимого свойства этого элемента и, наконец, его значение:

let valueHandle = await link.getProperty('textContent');
console.log(await valueHandle.jsonValue());

Более простое, более чистое решение

Вы можете page.$eval выбрать желаемый селектор элемента и функцию, которая будет выполняться на элементе при его обнаружении.

const linkTitle = await page.$eval('.question-hyperlink', el => el.textContent);
console.log(linkTitle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...