获取元素的子文本的方法,无论在<p>标记中

我正在Node.js构build一个刮板,并遇到了一个小问题。 我试图构build一个获取元素文本的函数,而不pipe它是embedded在<p>标记中,还是embedded在<span>或者只是包含文本的<div>

以下目前仅适用于<p>标签中包含的文本:

 function getDescription(product){ var text =[]; $('.description *') .each(function(i, elem) { var dirty = $(this).text(); var clean = sanitize(dirty).trim(); if (clean.length){ text.push(clean); } }); text.join(','); sanitize(text).trim(); return text; } 

这适用于这样的代码:

 <div class="description"> <p>Test test test</p> </div> 

但是这不起作用:

 <div class="description"> Test test test </div> 

作为参考, sanitizetrimfunction是Node Validator一部分,但这与我的问题没有特别的关系 – 它们只是取一个string并从中删除空格。

任何想法,我可以做什么,使一个function工作的两个实例? 为了给伤害增加侮辱,我稍微有点受限,因为node使用cheerio库来复制jQuery一些function,但不是全部。

使用.contents()而不是*

 function getDescription(product){ var text =[]; $('.description').contents() .each(function(i, elem) { var dirty = $(this).text(); var clean = sanitize(dirty).trim(); if (clean.length){ text.push(clean); } }); text.join(','); sanitize(text).trim(); return text; } 

使用$(".description").contents() ( docs )。

*仅select元素节点,但不select文本节点。

你可以使用innerText

 var text =[]; $('.description').each(function(i, elem) { var dirty = elem.innerText; var clean = sanitize(dirty).trim(); if (clean.length){ text.push(clean); } });