3

DOM オブジェクトからすべてのテキストを抽出するために JavaScript を使用しています。ノードが TEXT_NODE タイプの場合、ノードの nodeValue を蓄積する場合、私のアルゴリズムは DOM オブジェクト自体とその子孫を調べます。
奇妙な理由で、次のようなものも得られます。

#hdr-editions a { text-decoration:none; }
#cnn_hdr-editionS { text-align:left;clear:both; }
#cnn_hdr-editionS a { text-decoration:none;font-size:10px;top:7px;line-height:12px;font-weight:bold; }
#hdr-prompt-text b { display:inline-block;margin:0 0 0 20px; }
#hdr-editions li { padding:0 10px; }

これをフィルタリングするにはどうすればよいですか?他のものを使用する必要がありますか? テキストのみが必要です。

4

4 に答える 4

7

物事の外観から、<style>要素からテキストも収集しています。それらのチェックを実行することをお勧めします。

var ignore = { "STYLE":0, "SCRIPT":0, "NOSCRIPT":0, "IFRAME":0, "OBJECT":0 }

if (element.tagName in ignore)
    continue;

他の要素をオブジェクト マップに追加して、それらを無視することができます。

于 2011-05-22T10:45:27.860 に答える
1

style要素をスキップしたい。

あなたのループでは、これを行うことができます...

if (element.tagName == 'STYLE') {
   continue;
}

scripttextareaなどもスキップしたいでしょう。

于 2011-05-22T10:45:32.687 に答える
0

[アンディの優れた回答に対するOPのコメントを読んだ後に追加された回答]

問題は、STYLE や SCRIPT タグなど、通常はブラウザーによってコンテンツがレンダリングされない要素内にテキスト ノードが表示されることです。

深度優先検索を使用して DOM ツリーをスキャンすると、スキャンはそのようなタグのコンテンツをスキップする必要があります。

たとえば、再帰的な深さ優先の DOM ツリー ウォーカーは次のようになります。

function walker(domObject, extractorCallback) {
    if (domObject == null) return; // fail fast
    extractorCallback(domObject);
    if (domObject.nodeType != Node.ELEMENT_NODE) return;
    var childs = domObject.childNodes;
    for (var i = 0; i < childs.length; i++)
        walker(childs[i]);
}

var textvalue = "":
walker(document, function(node) { 
    if (node.nodeType == Node.TEXT_NODE)
        textvalue += node.nodeValue;
});

そのような場合、コンテンツを見たくないことがわかっているタグにウォーカーが遭遇した場合は、ツリーのその部分への移動をスキップする必要があります。したがってwalker()、次のように適応する必要があります。

var ignore = { "STYLE":0, "SCRIPT":0, "NOSCRIPT":0, "IFRAME":0, "OBJECT":0 }

function walker(domObject, extractorCallback) {
    if (domObject == null) return; // fail fast
    extractorCallback(domObject);
    if (domObject.nodeType != Node.ELEMENT_NODE) return;

    if (domObject.tagName in ignore) return; // <--- HERE

    var childs = domObject.childNodes;
    for (var i = 0; i < childs.length; i++)
        walker(childs[i]);
}

そうすれば、気に入らないタグ​​が見つかった場合、そのタグとそのすべての子をスキップするだけで、エクストラクタがそのようなタグ内のテキスト ノードに公開されることはありません。

于 2011-05-22T11:21:57.987 に答える
0

DOM に関する限り、これはテキストです。タグを除外 (スキップ) する必要が<script>あり<style>ます。

于 2011-05-22T10:44:44.910 に答える