TEXT_NODE: возвращает ТОЛЬКО текст? - PullRequest
3 голосов
/ 22 мая 2011

Я использую JavaScript для извлечения всего текста из объекта DOM. Мой алгоритм обращается к самому объекту DOM и его потомкам, если узел имеет тип TEXT_NODE, а затем накапливает его nodeValue.
По какой-то странной причине я также получаю такие вещи:

#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 ]

7 голосов
/ 22 мая 2011

Судя по всему, вы также собираете текст из <style> элементов. Возможно, вы захотите запустить проверку для тех:

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

if (element.tagName in ignore)
    continue;

Вы можете добавить любые другие элементы к карте объектов, чтобы игнорировать их.

1 голос
/ 22 мая 2011

Вы хотите пропустить style элементов.

В вашем цикле вы можете сделать это ...

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

Вы также, вероятно, хотите пропустить script,textarea и т. Д.

0 голосов
/ 22 мая 2011

[Ответ добавлен после прочтения комментариев ОП к отличному ответу Энди]

Проблема в том, что вы видите текстовые узлы внутри элементов, содержимое которых обычно не отображается браузерами - таких как теги 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]);
}

Таким образом, если мы увидим тег, который вам не нравится, мы просто пропустим его и всех его потомков, и ваш экстрактор никогда не будетподвергаться воздействию текстовых узлов внутри таких тегов.

0 голосов
/ 22 мая 2011

Это текст для DOM. Вам придется отфильтровать (пропустить) теги <script> и <style>.

...