You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从CDPElementHandle中提取可读的文本内容?

解决Puppeteer获取元素文本内容的问题

你的问题出在两个核心点:一是page.$$返回的ElementHandle需要在页面上下文内获取文本,直接用getProperties的方式逻辑有误;二是browser.close()在异步操作完成前就执行,导致还没拿到内容浏览器就已关闭。

下面是两种可行的修正方案:

方案一:用page.$$eval直接获取文本(最简洁)

const puppeteer = require("puppeteer") 
const main = async () => {
  const browser = await puppeteer.launch({})
  const page = await browser.newPage()
  await page.goto("https://www.example.com")
  await page.waitForSelector(".example") 
  
  // 直接在页面上下文遍历元素,返回文本数组
  const texts = await page.$$eval(".example", elements => 
    elements.map(el => el.textContent.trim())
  )
  
  console.log(texts);
  await browser.close() // 确保所有异步操作完成后再关闭浏览器
}
main()

方案二:基于page.$$返回的ElementHandle处理

const puppeteer = require("puppeteer") 
const main = async () => {
  const browser = await puppeteer.launch({})
  const page = await browser.newPage()
  await page.goto("https://www.example.com")
  await page.waitForSelector(".example") 
  
  const titleNodes = await page.$$(".example")
  // 用Promise.all等待所有元素的文本获取完成
  const texts = await Promise.all(
    titleNodes.map(node => node.evaluate(el => el.textContent.trim()))
  )
  
  console.log(texts);
  await browser.close()
}
main()

关键说明:

  • page.$$eval是最高效的方式,直接在浏览器上下文完成元素遍历和文本提取,无需手动处理ElementHandle。
  • 如果用page.$$,必须通过Promise.all等待所有异步操作结束,同时用evaluate进入页面上下文获取文本,原代码的forEach无法处理异步等待,且getProperties("textContent")需要额外调用jsonValue()才能拿到实际值,写法冗余且容易出错。

内容的提问来源于stack exchange,提问作者myself

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:22:37