3

我正在使用 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

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;
}

您可能还想跳过script,textarea等。

于 2011-05-22T10:45:32.687 回答
0

就 DOM 而言,这是文本。您必须过滤掉(跳过)<script><style>标签。

于 2011-05-22T10:44:44.910 回答
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 遇到您知道您不希望看到其内容的标签,您应该跳过进入树的那部分。所以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 回答