Javascript麻烦从HTML中提取文本

时间:2012-12-27 16:08:53

标签: javascript html text extraction

我这样做是为了尝试提取文字。

<script type = "text/javascript">
function extractText(node){
    var all = "";
    for (node=node.firstChild;node;node=node.nextSibling){
        alert(node.nodeValue + " = " + node.nodeType);
        if (node.nodeType == 3){
            all += node.nodeValue   
        }
    }
    alert(all);
}
</script>

它位于html文档的头部。 身体看起来像......

<body onload = "extractText(document.body)">
Stuff
<b>text</b>
<script>
var x = 1;
</script>
</body>

问题是alert(all);只显示“Stuff”,并且它会添加一些我在执行alert(node.nodeValue + " = " + node.nodeType);时并不真正理解的空值。它说null = 3几次。谁能告诉我为什么这不能正常工作?提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果您想要文档中的文本,您可能需要查看递归调用。但是,如果您不关心孩子,请删除以下第一个if (node.hasChildNodes()){}条件:

function extractText(node){
    var txt = '';
    // recursive exploration and option to uncomment the check for a <script>
    // <script>s will have children as the the actual portion being executed
    // is considered a text node (nodeType===3)
    if (node.hasChildNodes()/* && node.nodeName !== 'SCRIPT'*/){
        for (var c = 0; c < node.childNodes.length; c++){
            txt += extractText(node.childNodes[c]);
        }
    }else if(node.nodeType===3){
        txt += node.textContent;
    }
    return txt;
}
alert(extractText(document.body));

此外,您可能希望抓住textContent而不是nodeValue,但这是您的电话。如果nodeNameSCRIPT,您也可以更精细地测试并忽略if(如果您这样选择)但我会让您做出决定。

跟进:这是一个你可以玩的小提琴,<script>测试评论和可选的空白删除:http://jsfiddle.net/KZuk5/2/

答案 1 :(得分:2)

有不同类型的节点 - 特别是我们正在看两个节点,一个文本节点和一个HTML节点。文本节点是一个对象,并具有一个名为nodeValue的属性(您正在正确访问)。但是,HTML节点没有nodeValue属性(或者更确切地说,它设置为null)。

要获取HTML节点的内部值,请使用.innerHTML