【问题标题】:Recommended HTML readability transcoding libraries in .Net [closed].Net中推荐的HTML可读性转码库[关闭]
【发布时间】:2012-06-11 09:12:14
【问题描述】:

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

What have I tried?

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

编辑:我正在寻找一个真正筛选内容的库,并且只给我页面中的“相关”文本(即对于这个页面,“评论”、“聊天”、“元”等词,顶部栏中的“关于”和“常见问题解答”不会显示,以及“用户贡献许可下”。

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

【问题讨论】:

    标签: html .net readability


    【解决方案1】:

    CsQuery:https://github.com/jamietre/csquery

    这是一个 .NET 4 jQuery 端口。可以通过多种方式去除非内容节点:.Text 方法将所有内容作为字符串抓取;或过滤文本节点,例如

    var dom = CQ.CreateFromUrl(someUrl); 
    // or var dom = CQ.Create(htmlText);
    
    IEnumerable<string> allTextStrings = dom.Select("*")
                .Contents()
                .Where(el => el.NodeType == NodeType.TEXT_NODE)
                .Select(el => el.NodeValue);
    

    它的工作原理与 jQuery 相同,当然,除了您还拥有 .NET 框架和 LINQ 来让您的生活更轻松。 Select 选择 DOM 中的所有节点,然后 Contents 选择每个节点的所有子节点(包括文本节点)。 CsQuery 就是这样;然后使用 LINQ,Where 仅过滤文本节点,Select 从每个节点中获取实际文本。

    这将包含很多空格,它会返回所有内容。如果您只是想要整个页面的文本块,只需

    string text = dom.Select("body").Text();
    

    会做的。 Text 方法合并空格,因此每段实际文本之间将有一个空格。

    【讨论】:

    • 这似乎是另一种形式的 HtmlAgilityPack。看起来不错,但不是我需要的 - 请参阅我的编辑。
    • 哦 - 我认为您的 HAP 问题是难以提取文本与结构节点。我不确定你将如何确定什么是“相关的”,这似乎是一个人工智能问题,但我认为你可以通过忽略任意字符以下的任何文本节点来做得相当好。试图决定什么是“主要内容”和什么是“侧边栏”,除了简单的文本大小之外,如果不知道你在内容中寻找什么,几乎是不可能的。
    • NReadability、Instapaper、readability.com 是一些产品的例子(或多或少)。这是可能的,我不是在寻找不可能的完美事物。
    • 好吧,如果你不需要那些工具可能做的大量启发式分析的好处(例如不需要完美),我认为你可以用一个基本算法来做用csquery很容易实现。例如去除内联标签(例如 span、i、b);保留所有标题;并丢弃剩​​余的包含少于 80 个字符的块元素。我敢打赌,这将消除大多数网页上的所有布局内容。无论如何,我现在理解你的问题 - 太糟糕了 NReadability 不能更好地工作 - 但你可能会在实现一些基本的东西上有所突破。
    【解决方案2】:

    我不知道这是否仍然相关,但这是一个我经常遇到的有趣问题,而且我在网络上没有看到太多涵盖它的材料。

    我自己已经实现了一个工具,可以在几个月内完成这项工作。 出于合同义务,我不能随意分享这个工具。不过,我可以随意分享一些关于您可以做什么的建议。

    可悲的真相 :(

    我可以向您保证,在自己承担创建可读性工具的任务之前,我们已经尝试了所有选项。目前还没有这样的工具可以满足我们的需求。

    那么,您要提取内容吗?

    太棒了!你需要一些东西

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

    好的,我都准备好了,接下来呢?

    令人惊讶的是,在内容提取领域的研究很少。一个突出的部分是Boilerplate Detection using Shallow Text Features。您还可以在 StackOverflow 中从论文作者那里阅读 this answer,了解 Readability 的工作原理以及一些方法。

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

    我读完了,实践中做了什么

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

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

    • 元内容。分析文本链接的密度,这本身就是一个强大的工具,您可以将链接文本的数量与 html 文本进行比较并使用它,最密集的文本通常是内容所在的位置。 CsQuery 让您可以轻松地将文本数量与嵌套链接标签中的文本数量进行比较。

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

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

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

    • 选择器的固定列表。令人惊讶的是,这非常有效,人们往往会忘记它。如果您使用选择器从特定的几个站点抓取并手动提取内容可能是最快的事情。如果可以,请保持简单:)

    实践中

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2010-09-25
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2010-10-01
      • 2011-06-01
      相关资源
      最近更新 更多