使用Cheerio选择.boxMain下b标签的紧邻兄弟元素并提取文本的方法
使用Cheerio选择.boxMain下b标签的紧邻兄弟元素并提取文本的方法
嘿,我来帮你搞定这个Cheerio的文本提取问题~你已经能轻松选中<b>标签了,但要获取它们后面的纯文本内容(就是那些没被任何标签包裹的文本),需要注意Cheerio对文本节点的处理方式——普通的next()方法只会选中标签元素,而我们要找的是文本节点(nodeType为3的节点)。
这里给你两种实用的方法:
方法一:直接遍历兄弟节点,跳过空白文本
利用原生DOM的nextSibling属性,逐个检查兄弟节点,跳过那些只有空白的文本节点,直到找到有实际内容的文本:
$('.boxMain b').toArray().map(item => { let nextNode = item.nextSibling; // 跳过空白文本节点和非文本节点 while (nextNode && (nextNode.nodeType !== 3 || !nextNode.textContent.trim())) { nextNode = nextNode.nextSibling; } // 返回清理后的文本,找不到就返回空字符串 return nextNode ? nextNode.textContent.trim() : ''; });
这段代码会自动过滤掉HTML里的换行、空格这些无效空白,精准拿到你需要的this is the first area to select和this is the second area to select。
方法二:从父元素的所有子节点中定位
如果你的HTML结构比较复杂,也可以先拿到<b>标签的父元素,然后遍历父元素下的所有子节点(包括文本节点),找到<b>标签之后的第一个有效文本:
$('.boxMain b').toArray().map(item => { const parentChildren = $(item.parentNode).contents(); let foundTargetB = false; let targetText = ''; parentChildren.each((index, node) => { // 先找到当前的<b>标签,标记状态 if (node === item) { foundTargetB = true; return; } // 找到<b>标签后,检查下一个文本节点是否有有效内容 if (foundTargetB && node.nodeType === 3) { const trimmedText = node.textContent.trim(); if (trimmedText) { targetText = trimmedText; return false; // 找到后立即退出循环,提升效率 } } }); return targetText; });
这个方法兼容性更强,哪怕<b>标签和目标文本之间有其他空白节点或者注释节点,也能准确找到你要的内容。
备注:内容来源于stack exchange,提问作者user21189833
相关产品推荐
相关产品推荐

