jquery - 脚本无法产生期望的结果

标签 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();
})();

Although I know that if I bring about the following change into my above script, it will work. However, I would like to stick to the way I tried above so that I can understand how .$eval() works in this very case.

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

最佳答案

page.$(选择器) 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);

关于jquery - 脚本无法产生期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912862/

相关文章:

javascript - 计算数组的位/字节大小

node.js - 为什么我在使用 apt-get 安装时会得到旧版本的 nodejs 和 npm?

node.js - 在 heroku nodejs 服务器准备好之前执行任务

python - 使用 BeautifulSoup 进行网页抓取,得到空列表

python - 抓取两种类型的 URL

python - Python 数据抓取的作业调度

jquery - 我想更改表格行的位置

javascript - 不调用回调函数(如 afterMove)

jquery - 如何简化这个 jQuery 选择器?

node.js - Mongoose :.findById 不是函数