JavaScript:给定DOM,找到最大的连续文本(内容部分)

时间:2010-10-13 04:37:24

标签: javascript html xml dom

目标是找到文档中最大的连续文本。问题是最大的部件不在单个元件下,例如,一篇博客文章中包含<p>个标签,因此迭代节点并比较innerHTML s无效。通过获取元素的innerText,根节点始终包含最大的文本。那么如何实现呢?


由于

3 个答案:

答案 0 :(得分:3)

您的问题可能很复杂,因为如果div包含2个字,加上<p>内的另外div且其中包含200个字,那么您是否计算{{ 1}}有202个单词,或者你算{200}单词的div因此是最大的?

如果p有4个边框,那么说p有200个字是有道理的。如果没有边框,则说p有202个单词是有道理的。

您可以尝试编写一个函数来遍历节点,如果有任何带有4个边框的div元素,则不要包含单词count。

如果浮动block s,设置为div以解决IE 6错误,事情可能会更复杂。或者如果有边框,但颜色与包含display:inline的背景颜色相同。

如果你不关心有边框的内部元素,那么一次尝试可以只是查看身体的直接子项,并找出其中有多少个字符(所有后代下的文本总和,可能使用innerText或innerHTML并剥离所有标签。)

如果你正在寻找内容部分,你可能还会寻找具有最大区域(宽x高)的最大元素,除非左边和右边有一个长而窄的侧边栏或广告部分,内容范围广,但非常短。

答案 1 :(得分:0)

屏幕抓取中最有效的策略始终是为每个要抓取的实例定义模板。考虑到现在大多数页面都有一个“内容”容器,您所要做的就是为每个源添加“content”div的名称。如果您正在抓取博客,它也会变得更加容易,因为您可以为大多数流行的博客系统创建规则,因为它们通常在实现中具有相同的内容容器。因此,您可以先尝试默认值,如果它们出现空,请记录该URL并手动识别容器。

如果你真的想自动化这个,你可能会(我在这里猜测)需要比较兄弟节点的大小并检查它们在DOM的每个级别的DOM树的类型,并且只跟随最大的分支。当你达到所有兄弟姐妹都是文本节点的级别时,这些容器最容易成为你的“主要内容”容器。你可以使用jQuery进行节点迭代或只是“普通”的javascript DOM函数来实现这一点。

答案 2 :(得分:0)

当我开始输入这个答案时,我打算写一下这很简单。 我在考虑cloneNode(false)。然后我想到了textnodes,然后是normalize函数,然后是textnodes不相邻的情况。

除了递归整个DOM之外,您还必须对每个elementNode执行以下操作(NodeType = 1)

ElLength = thisEl.nodeValue.length ;
if (thisEl.hasChildNodes()){
    for each (node in thisEl.childNodes){
        if (node.nodeType == 3) { // textnode
            ElLength += node.data.length;
        }
    }
}

然后你必须记住最大的ElLength和相应的元素。

如果你的DOM很庞大,它会很慢。

代码尚未经过测试......我写的只是为了给出一个例子