【问题标题】:Script unable to yield the desired result脚本无法产生所需的结果
【发布时间】:2019-03-25 13:20:04
【问题描述】:

我在node.jspuppeteer 中编写了一个脚本,以从网页的多个帖子中抓取第一个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);
})

【问题讨论】:

    标签: jquery node.js web-scraping puppeteer


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2015-01-09
      • 2019-07-03
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多