已经做了哪些工作(如果有的话)来自动确定 html 文档中最重要的数据?举个例子,想象一下您的标准新闻/博客/杂志风格的网站,其中包含导航(可能带有子菜单)、广告、评论和奖品 - 我们的文章/博客/新闻正文。

您如何以自动方式确定新闻/博客/杂志上的哪些信息是主要数据?

笔记:理想情况下,该方法适用于格式良好的标记和糟糕的标记。是否有人使用段落标签来组成段落或一系列中断。

有帮助吗?

解决方案

可读性确实做得不错。

它是开源的,发布在Google Code上


更新:我看到(通过HN )有人使用了可读性< a href =“http://andrewtrusty.appspot.com/readability/”rel =“nofollow noreferrer”> mangle RSS以自动方式提供更有用的格式。

其他提示

想象一下您的标准新闻/博客/杂志风格的网站,其中包含导航(可能带有子菜单)、广告、评论和奖品 - 我们的文章/博客/新闻正文。

您如何以自动方式确定新闻/博客/杂志上的哪些信息是主要数据?

我可能会尝试这样的事情:

  • 打开网址
  • 从该页面读取到同一网站的所有链接
  • 跟踪所有链接并为每个 URL(HTML 文件)构建 DOM 树
  • 这应该可以帮助您想出多余的内容(包括模板等)
  • 比较同一站点上所有文档的 DOM 树(树行走)
  • 删除所有冗余节点(即重复、导航标记、广告等)
  • 尝试识别相似的节点并在可能的情况下剥离
  • 找到在该网站的其他 DOM 中找不到的最大的唯一文本块(即独特的内容)
  • 添加为进一步处理的候选者

这种方法看起来很有前途,因为它做起来相当简单,但仍然具有良好的适应性潜力,甚至对于过度使用模板的复杂 Web 2.0 页面也是如此,因为它会识别所有页面之间的相似 HTML 节点在同一个网站上。

通过简化使用评分系统来跟踪先前被识别为包含唯一内容的 DOM 节点,这可能会得到进一步改进,以便这些节点优先用于其他页面。

有时会将CSS Media部分定义为“Print”。它的用途是“点击此处打印此页面”链接。通常人们用它来剥去大量的绒毛,只留下信息的肉。

http://www.w3.org/TR/CSS2/media.html

我会尝试阅读这种风格,然后抓住任何可见的东西。

您可以使用支持向量机进行文本分类。一个想法是将页面分成不同的部分(比如将每个结构元素视为div是一个文档)并收集它的一些属性并将其转换为向量。 (正如其他人所说,这可能是单词数量,链接数量,图像数量越多越好。)

首先从大量文档(100-1000)开始,您已经选择哪个部分是主要部分。然后使用此集训练您的SVM。

对于每个新文档,您只需将其转换为vector并将其传递给SVM。

此向量模型在文本分类中实际上非常有用,并且您不需要必须使用SVM。您也可以使用更简单的贝叶斯模型。

如果您有兴趣,可以在中找到更多详情。信息检索简介。 (在线免费提供)

我认为最直接的方法是寻找没有标记的最大文本块。然后,一旦找到它,找出它的界限并提取它。你可能想要从“not markup”中排除某些标签。像链接和图像,取决于你的目标。如果这将有一个界面,可能包括要从搜索中排除的标签的复选框列表。

您也可以在DOM树中寻找最低级别,并找出哪些元素是最大的,但是在写得不好的页面上效果不佳,因为dom树经常在这些页面上被破坏。如果您最终使用此功能,我会想出一些方法来查看浏览器在尝试之前是否已进入怪癖模式。

您也可以尝试使用其中的一些检查,然后提出一个指标来确定哪个最好。例如,仍然尝试使用上面的第二个选项,但是给它的结果是较低的“等级”。如果浏览器正常进入怪癖模式。坚持这一点显然会影响性能。

我认为一个非常有效的算法可能是,“哪个DIV中包含少量链接的文本最多?”

很少有广告有超过两三个句子的文字。例如,请查看此页面的右侧。

内容区域几乎总是页面上宽度最大的区域。

我可能会开始使用标题和Head标记中的任何其他内容,然后按顺序过滤标题标记(即h1,h2,h3等)......除此之外,我想我会按顺序排序,从上到下。根据它的样式,假设页面标题具有ID或唯一类别可能是一种安全的选择。

我会用标点符号查找句子。菜单,页眉,页脚等通常包含单独的单词,但不包含以逗号结尾且以句点或等效标点结尾的句子。

您可以查找包含带标点符号的句子的第一个和最后一个元素,并将所有内容置于其间。标题是一种特殊情况,因为它们通常也没有标点符号,但您通常可以在句子之前立即将它们识别为Hn元素。

虽然这显然不是 的答案,但我认为重要的内容位于样式页面的中心附近,并且通常由标题等中断的几个块组成。结构本身也可能是标记中的赠品。

文章/帖子/帖子之间的差异将是一个很好的过滤器,可以找出区分特定页面的内容(显然,这必须进行扩充,以过滤掉广告中的随机垃圾,“当天的报价”或旗)。对于多个页面,内容的结构可能非常相似,因此不要过多依赖结构差异。

Instapaper 可以很好地完成这项工作。您可能需要查看 Marco Arment的博客,了解他是如何做到的。

今天,大多数新闻/博客网站都在使用博客平台。 所以我会创建一组规则来搜索内容。 例如,两个最受欢迎的博客平台是wordpress和Google Blogspot。

Wordpress帖子标有:

<div class="entry">
    ...
</div>

Blogspot帖子标有:

<div class="post-body">
    ...
</div>

如果css类的搜索失败,你可以转向其他解决方案,识别最大的文本块等等。

由于可读性不再可用:

  • 如果您只对结果感兴趣,则可以使用 Readability 的后继者 , ,一项网络服务。
  • 如果您对如何完成此操作的一些代码感兴趣并且更喜欢 JavaScript,那么 Mozilla 的 可读性.js, ,用于 Firefox 的阅读器视图。
  • 如果你更喜欢Java,你可以看看 症结, ,这也做得相当不错。
  • 或者,如果 Kotlin 更适合您的语言,那么您可以看看 可读性4J, ,上面的 Readability.js 的端口。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top