jquery - 脚本无法产生所需的结果
问题描述
我编写了一个脚本,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);
})
解决方案
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);
推荐阅读
- .htaccess - 根目录有什么方法可以通过htaccess没有favicon而是子文件夹?
- c - 合并排序中的递归不增长:
- c# - 将 KeyCodes 设置为等于 OVRInput 按钮?
- sql-server - exec 存储过程是同步的吗?
- php - Codeigniter 4 验证总是使用 getJSON 返回 false
- git - Git推送速度波动和缓慢-如何加快?
- angular - Angular Observable 组件和服务交互
- python - 将 pandas 数据框值与字典键进行比较,然后将该字典中的值插入到新列中
- actions-on-google - Google Actions 未在履行请求中传递用户信息(访问令牌/身份令牌)
- python - 合并 2 个数据帧,键分为 2 列