1

我正在建造一个刮刀,Node.js但遇到了一个小问题。我正在尝试构建一个获取元素文本的函数,无论它是嵌入在<p>标签中,还是嵌入在 a 中,<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>

作为参考,sanitizeandtrim函数是 的一部分Node Validator,但这与我的问题并不特别相关 - 它们只是获取一个字符串并从中删除空格。

关于我可以做些什么来使一个功能适用于两个实例的任何想法?雪上加霜的是,我在node使用cheerio库来复制 的某些功能时受到了一些限制jQuery,但不是全部。

4

3 回答 3

6

使用.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;
}
于 2013-06-19T12:42:32.143 回答
3

使用$(".description").contents()文档)。

唯一选择元素节点,但不选择*文本节点。

于 2013-06-19T12:41:59.473 回答
0

您可以使用innerText

var text =[];
$('.description').each(function(i, elem) {
    var dirty = elem.innerText;

    var clean = sanitize(dirty).trim();
    if (clean.length){
        text.push(clean);
    }
});
于 2013-06-19T12:45:34.860 回答