目标是找到文档中最大的连续文本。问题是最大的部件不在单个元件下,例如,一篇博客文章中包含<p>
个标签,因此迭代节点并比较innerHTML
s无效。通过获取元素的innerText
,根节点始终包含最大的文本。那么如何实现呢?
答案 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很庞大,它会很慢。
代码尚未经过测试......我写的只是为了给出一个例子