Cheerio多子节点文本提取:如何避免文本合并并添加分隔空格
解决Cheerio多子节点文本合并无空格的问题
直接用.contents()遍历所有子节点,过滤并处理文本节点,再用空格拼接结果,就能避免不同子节点文本直接连写的问题。
正确的代码实现:
$(selector) .first() .contents() .map((_, node) => { // 处理文本节点(nodeType为3) if (node.nodeType === 3) { return $(node).text().replace(/\s+/g, " ").trim(); } // 递归处理元素节点的子文本节点(nodeType为1) if (node.nodeType === 1) { return $(node).contents().map((_, child) => { if (child.nodeType === 3) { return $(child).text().replace(/\s+/g, " ").trim(); } return ""; }).get().join(" ").trim(); } return ""; }) .get() .filter(text => text) // 过滤空字符串 .join(" ") .trim();
代码说明
.contents()能获取当前元素的所有子节点(包括文本节点和元素节点)- 通过
nodeType区分节点类型:3代表文本节点,1代表元素节点 - 文本节点直接做空格去重和修剪处理
- 元素节点递归遍历内部文本,避免嵌套标签导致的文本丢失
- 最后用空格拼接所有有效文本,确保不同节点的文本被分隔开
比如处理<div>Hello<span>World</span><p>!</p></div>这类结构,会得到Hello World !的结果,不会出现文本连写的情况。
内容的提问来源于stack exchange,提问作者seventeen
相关产品推荐
相关产品推荐

