推荐的.Net中的HTML可读性转码库

sel*_*ary 3 .net html readability

背景
我正在尝试阅读和分析来自网页的内容,重点是页面的主要内容 - 没有菜单,侧边栏,脚本和其他HTML混乱.

我试过了什么?

  • 我已经尝试过NReadability,但它会抛出异常并且在太多情况下失败.除此之外,它是一个很好的解决方案.
  • HTML Agility Pack不是我在这里需要的,因为我确实想要摆脱非内容代码.

编辑:我正在寻找一个实际上通过内容筛选的图书馆,并且仅向我提供页面中的"相关"文本(即,对于此页面,单词"review","chat","meta","about" ,顶部栏中的"faq" 将不会显示,以及"许可下的用户贡献".

那么,您是否知道用于从网站中提取内容的任何其他稳定的.Net库?

Ben*_*aum 7

我不知道这是否仍然具有相关性,但这是一个我经常遇到的一个有趣的问题,我没有在网上看到太多关于它的材料.

我已经实现了一个工具,可以在几个月的时间内完成这项工作.出于合同义务,我不能自由地分享这个工具.但是,我可以自由地分享一些关于你能做什么的建议.

悲哀的事实 :(

我可以向您保证,在完成自己创建可读性工具的任务之前,我们已尝试过所有选项.目前还没有这样的工具能满足我们的需要.

那么,你想提取内容吗?

大!你需要一些东西

  1. 用于处理页面HTML的工具.我使用CsQuery,这是Jamie在上面的答案中建议的.它非常适合选择元素.
  2. 一种编程语言(在这个例子中是C#,任何.NET语言都可以!)
  3. 一种允许您自己下载页面的工具.CsQuery它本身就是createFromUrl.如果要对其进行预处理并对标题进行更精细的控制,可以创建自己的帮助程序类来下载页面.(尝试与用户代理一起玩,寻找移动版本等)

好的,我已经全部成立,下一步是什么?

在内容提取领域的研究令人惊讶.突出的是使用浅文本特征的Boilerplate Detection.您还可以在本文作者的StackOverflow中阅读此答案,了解可读性的工作原理以及一些方法.

这里有一些我喜欢的论文:

我已经读完了,在实践中做了什么

根据我的经验,以下是提取内容的好策略:

  • 简单的启发式:过滤<header><nav>标记,删除仅包含链接的列表.删除整个<head>部分.根据元素的名称给元素赋予负/正分数,并删除分数最低的元素(例如,包含名称的类的div navigation可能会获得较低的分数).这就是可读性的工作原理.

  • 元内容.分析文本链接的密度,这是一个独立的强大工具,你可以比较链接文本的数量与html文本并使用它,最密集的文本通常是内容的位置.CsQuery允许您轻松地将文本量与嵌套链接标记中的文本量进行比较.

  • 模板化.在同一网站上抓取几个页面并分析它们之间的差异,常量通常是页面布局,导航和广告.您通常可以根据相似性进行过滤.这种基于"模板"的方法非常有效.诀窍是提出一种有效的算法来跟踪模板并检测模板本身.

  • 自然语言处理.这可能是这里最先进的方法,使用自然语言处理工具来检测段落,文本结构以及实际内容的开始和结束位置相对简单.

  • 学习,学习是这类任务的一个非常强大的概念.在最基本的形式中,这涉及创建一个程序,该程序"猜测"HTML元素,以从网站上的一组预定义结果中删除,并了解哪些模式可以删除.根据我的经验,这种方法在每个站点的机器上最有效.

  • 修正了选择器列表.令人惊讶的是,这是非常有效的,人们往往会忘记它.如果您使用选择器从特定的几个站点进行搜索,并且手动提取内容可能是最快的事情.如果你能:)保持简单:)

在实践中

混合搭配,一个好的解决方案通常涉及多个策略,结合几个.我们最终得到了一些相当复杂的东西,因为我们将它用于复杂的任务.在实践中,内容提取是一项非常复杂的任务.不要尝试创建非常通用的东西,坚持需要抓取的内容.测试很多,单元测试和回归对于这类程序非常重要,总是比较和阅读可读性代码,它非常简单,它可能会让你开始.

祝你好运,让我知道这是怎么回事.