如何在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
相关产品推荐
相关产品推荐

