Cheerio 如何通过$('.date')选择器获取同级标签后的文本节点
失效原因
所有常规next()方法的返回值为空,本质是这类方法默认仅匹配元素类型的相邻兄弟节点,目标日期是和.category同级的纯文本节点,不属于元素类型,因此无法被元素级遍历方法捕获。
可直接运行的实现代码
- 核心API提示:需要用
contents()方法获取容器下所有类型的节点(包含文本、元素、注释节点),不能用仅返回元素节点的children()方法
const cheerio = require('cheerio') const html = ` <html> <body> <span class="date"> <span class="category">Article</span> Sat, 22 Jan 2021 11:12 </span> </body> </html>` const $ = cheerio.load(html) // 方案1:从主选择器$('.date')出发过滤目标文本 const dateText = $('.date') .contents() .filter((index, node) => { // 排除带category类的元素节点 return !(node.attribs && node.attribs.class === 'category') }) .text() .trim() console.log(dateText) // 输出:Sat, 22 Jan 2021 11:12 // 方案2:从.category节点出发取相邻同级文本 const dateText2 = $('.category') .nextSibling .nodeValue .trim() console.log(dateText2) // 输出:Sat, 22 Jan 2021 11:12
常见踩坑说明
- 直接调用
$('.date').text()会把.category标签内的"Article"文本一并读取,无法分离出独立的日期内容 - 调用
children()方法拿到的子节点列表仅包含元素类型节点,对这类节点调用next()方法时,会自动跳过纯文本节点,最终返回空值 - 不要混用jQuery和Cheerio的节点遍历逻辑:获取同级纯文本时必须直接操作原生节点属性,不能依赖元素选择器的遍历规则
内容的提问来源于stack exchange,提问作者Haxtor.ID
相关产品推荐
相关产品推荐

