使用Puppeteer的page.$$eval获取DOM全部链接失败,原因何在?
搞定Puppeteer获取所有链接的问题
嘿,我知道你为啥只拿到一个链接了——问题出在你用page.$$eval()的回调函数逻辑上!
为啥结果不对?
先给你拆解下page.$$eval()的工作方式:它会先在浏览器里找到所有匹配a选择器的元素,把它们打包成一个数组传给你的回调函数。但你写的a => a.href,是把整个元素数组当成单个<a>元素来取href属性了!
数组本身哪有href啊?这时候浏览器就会“瞎凑数”,大概率给你返回的是当前页面的URL(也就是window.location.href),所以你才只看到那一个结果,根本没遍历到所有12个链接。
正确的写法应该是这样
你需要在回调里遍历这个元素数组,用map逐个提取每个<a>的href:
const hrefs = await page.$$eval('a', links => links.map(link => link.href));
运行这个代码,console.log(hrefs)就能输出所有12个链接的数组了!
额外给你个验证小技巧
如果你担心是不是选择器没匹配到足够的元素,可以先测一下匹配数量:
const totalLinks = await page.$$eval('a', links => links.length); console.log(totalLinks); // 这里应该输出12,确认下是不是真的匹配到了所有元素
这样就能先排除选择器的问题,确保后续逻辑没问题。
内容的提问来源于stack exchange,提问作者Vega
相关产品推荐
相关产品推荐

