从HTML文档中刮取最大的文本块

时间:2008-11-14 08:04:33

标签: html screen-scraping text-extraction html-content-extraction

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

<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文档树到它的叶子,加上文本的长度,只看到父母给我们的内容比父母更多的其他文本做。

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

5 个答案:

答案 0 :(得分:9)

一个字:Boilerpipe

答案 1 :(得分: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;
});

使用像a.compareDocumentPosition(b)这样的祖先函数,您还可以在排序期间(或之后)接收元素,具体取决于此事物的复杂程度。

答案 2 :(得分:1)

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

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

找到最多内容块后,遍历树回到其父级以获得答案。

我认为您的解决方案依赖于您遍历DOM的方式并跟踪您正在扫描的节点。

您使用的是哪种语言?您项目的任何其他详细信息?您可以使用特定语言或特定于软件包的工具。

答案 3 :(得分:1)

您还必须制定要选择节点的级别。在您的示例中,“body”节点中包含更多的文本。所以你必须确定一个'父元素'究竟是什么。

答案 4 :(得分:0)

我还可以说,文字银行是一个很好的帮助。任何常见的“广告”单词列表,如twitter和click以及连续的几个大写名词。拥有POS标签可以提高准确性。对于新闻网站,世界上所有已知主要城市的列表可以帮助分开。事实上,你几乎可以在不查看HTML的情况下抓取页面。