1

私はスクレーパーを構築しNode.jsていますが、わずかな問題に直面しています。<p>タグに埋め込まれているか、テキストが含まれている<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>

参考までに、 関数sanitizetrim関数は の一部ですがNode Validator、これは私の問題とは特に関係ありません。文字列を取得して空白を削除するだけです。

1 つの関数を両方のインスタンスで機能させるために何ができるかについてのアイデアはありますか? けがに侮辱を加えるために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 に答える