4

我正在研究一种算法,该算法将在给定 HTML 文件的情况下尝试挑选出它认为最有可能包含页面大部分内容文本的父元素。例如,它将选择以下 HTML 中的 div“内容”:

<html>
   <body>
      <div id="header">This is the header we don't care about</div>
      <div id="content">This is the <b>Main Page</b> content.  it is the
      longest block of text in this document and should be chosen as
      most likely being the important page content.</div>
   </body>
</html>

我想出了一些想法,比如遍历 HTML 文档树到它的叶子,将文本的长度相加,并且只有在父级给我们的内容比子级多的情况下才能查看父级的其他文本。

有没有人尝试过这样的事情,或者知道可以应用的算法?它不必是可靠的,但只要它能够猜出包含大部分页面内容文本的容器(例如,对于文章或博客文章),那就太棒了。

4

5 回答 5

10

一个词:锅炉管

于 2010-12-29T22:39:51.740 回答
5

这大致是我将如何处理这个问题:

// get array of all elements (body is used as parent here but you could use whatever)
var elms = document.body.getElementsByTagName('*');
var nodes = Array.prototype.slice.call( elms, 0 );

// get inline elements out of the way (incomplete list)
nodes = nodes.filter(function (elm) {
  return !/^(a|br?|hr|code|i(ns|mg)?|u|del|em|s(trong|pan))$/i.test( elm.nodeName );
});

// sort elements by most text first
nodes.sort(function(a,b){
  if (a.textContent.length == b.textContent.length) return 0;
  if (a.textContent.length > b.textContent.length)  return -1;
  return 1;
});

使用 ancestry 函数a.compareDocumentPosition(b),您还可以在排序期间(或之后)下沉元素,具体取决于这件事需要多么复杂。

于 2008-11-14T14:00:55.057 回答
1

您还必须制定要在其上选择节点的级别。在您的示例中,“body”节点中的文本数量甚至更多。所以你必须明确什么是“父元素”。

于 2008-11-14T08:18:28.710 回答
0

您可以创建一个应用程序来查找不考虑格式标记的连续文本块(如果需要)。您可以通过使用 DOM 解析器并遍历树来执行此操作,跟踪直接父级(因为那是您的输出)。

从父节点开始并遍历每个正在格式化的节点的树,它将继续该子块内的“计数”。它将计算内容的字符。

找到内容最多的块后,将树向上遍历到其父级以获取答案。

我认为您的解决方案取决于您如何遍历 DOM 并跟踪您正在扫描的节点。

您使用什么语言?您的项目还有其他详细信息吗?您也可以使用特定于语言或特定于包的工具。

于 2008-11-14T08:13:04.073 回答
0

我也可以说词库是一个很大的帮助。任何常见的“广告”单词列表,例如 twitter 和 click 以及连续的几个大写名词。拥有一个词性标注器可以提高准确性。对于新闻网站,世界上所有已知主要城市的列表可以帮助区分。事实上,你几乎可以不看 HTML 就抓取一个页面。

于 2011-05-03T11:41:59.440 回答