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

如何在Puppeteer中仅获取节点自身文本而非子节点文本?

用Puppeteer提取单个文本节点内容的解决方法

方法一:筛选子节点提取目标文本

修改你原来的代码逻辑,在evaluate里专门提取.dish元素下的第一个有效文本节点:

let selector = await page.waitForSelector("#monday .dish");
let text = await selector.evaluate(el => {
  // 过滤出元素下的非空文本节点
  const validTextNodes = Array.from(el.childNodes).filter(node => 
    node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== ""
  );
  // 返回第一个文本节点的内容,空值兜底
  return validTextNodes.length ? validTextNodes[0].textContent.trim() : "";
}) ?? "";

这段代码会精准拿到Potato Soup,不会包含<span>里的附加内容。

方法二:用XPath直接定位文本节点

也可以跳过元素选择器,直接用XPath定位目标文本节点,一步到位:

// 定位#monday下.dish元素的第一个非空文本节点
let [targetNode] = await page.$x('//div[@id="monday"]//div[@class="dish"]/text()[normalize-space() != ""]');
let text = targetNode ? await page.evaluate(node => node.textContent.trim(), targetNode) : "";

XPath的normalize-space() != ""会自动过滤掉换行、空白字符组成的无效文本节点,直接获取我们需要的内容。

原代码问题说明

el.textContent会把元素下所有子节点(包括子元素里的文本)的内容拼接在一起,所以才会得到Potato SoupWith smoked tofu这种合并结果,上面两种方法都是针对单个文本节点做提取,避免了内容合并的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:20:00