脚本无法产生预期的结果

时间:2018-10-21 07:00:35

标签: jquery node.js web-scraping puppeteer

我与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 :(得分:1)

page.$(selector) means,您想使用指定的选择器获取第一个元素的句柄,但没有给它任何选择器,这就是为什么它不起作用的原因。

相反,您可以获取所需元素的句柄:

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);