【问题标题】:Getting text from a URL in ASP.NET从 ASP.NET 中的 URL 获取文本
【发布时间】:2011-01-16 09:51:27
【问题描述】:

我正在寻找一种在 ASP.NET/C# 中提取给定 Web 地址的文本的可靠方法。谁能指出正确的方向?

此外,网址可以说是一个可能有很多广告和菜单等的新闻网站。我需要一些智能方法来仅提取相关内容。不确定如何做到这一点,因为我将如何定义什么是相关性?

我应该从 RSS 提要中阅读吗?对此有什么想法吗?

编辑 我添加了赏金。我希望从 URL 中提取“相关”文本。我的意思是“相关”,它应该从广告中排除文字(和其他不相关的信息)。输入将类似于新闻站点。我只需要提取新闻信息并删除无关文本

【问题讨论】:

  • HTML 敏捷包在这里有帮助吗?

标签: c# asp.net


【解决方案1】:

一旦你下载了页面,并开始使用像 HTML Agility Pack 这样的库来解析 html,那么你的工作就开始了 :)

屏幕抓取分为两部分。

首先是网络爬虫(网上有很多关于这方面的信息,还有一些其他答案在此处与 WebClient 一起提供的简单代码)。爬虫必须遍历链接和下载页面。如果您要下载很多页面并且有起始 url,您可以自己滚动,或使用现有的。查看Wikipedia 获取开源网络爬虫/蜘蛛列表。

第二部分是解析 html 并仅提取您想要的文本,并省略任何噪音(页眉、横幅、页脚等)。使用现有库很容易遍历 DOM,而弄清楚如何处理您解析的内容是困难的部分。

我之前在另一个SO question 上写过一些关于它的内容,它可能会为您提供一些如何手动获取所需内容的想法。根据我的经验,没有 100% 的方法可以找到页面的主要内容,而且您通常需要手动给它一些指示。困难的部分是如果页面的html布局发生变化,那么你的屏幕抓取器就会开始失效。

您可以应用统计数据并比较几个页面的 html,以推断广告、菜单等的位置,从而消除这些。

由于您提到新闻网站,与从原始 html 中解析文本相比,还有两种其他方法应该更容易应用于这些网站。

  1. 检查页面是否有打印 url。例如。 CNN 上的链接具有等效的打印 url,更容易解析。
  2. 检查页面是否具有 RSS 表示,并从 RSS 提要中选择文章文本。如果提要没有包含所有内容,它应该为您提供足够的文本以在完整的 html 页面中找到文本。

还可以查看The Easy Way to Extract Useful Text from Arbitrary HTML,了解如何创建更通用的解析器。代码是用 Python 编写的,但您应该可以毫不费力地转换它。

【讨论】:

    【解决方案2】:

    我认为你需要一个像 HTMLAgilityPack 这样的 html 解析器,或者你可以使用刚出生的婴儿。YQL,它是雅虎开发的新工具,它的语法类似于 SQL,你需要一点 XPATH 知识...

    http://developer.yahoo.com/yql/

    谢谢

    【讨论】:

      【解决方案3】:

      使用WebClient 实例获取您的标记...

      Dim Markup As String
      
      Using Client As New WebClient()
          Markup = Client.DownloadString("http://www.google.com")
      End Using
      

      然后use the HtmlAgilityPack 用 XPath 解析响应...

      Dim Doc As New HtmlDocument()
      Doc.LoadXML(Markup)
      
      If Doc.ParseErrors.Count = 0 Then 
          Dim Node As HtmlNode = Doc.DocumentNode.SelectSingleNode("//body");
      
          If Node IsNot Nothing Then
              'Do something with Node   
          End If
      End If
      

      【讨论】:

      • 很高兴在这里看到一些 VB。但是,我会注意到问题中有一个 C# 标记。如果您同时提供两者,您可能会获得更多支持。
      【解决方案4】:

      为了获得实际的 html 标记,请尝试 WebClient 对象。像这样的东西会让你得到标记:

      System.Net.WebClient client = new System.Net.WebClient ();
      
              // Add a user agent header in case the 
              // requested URI contains a query.
      
              client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
      
              Stream data = client.OpenRead ("http://www.google.com");
              StreamReader reader = new StreamReader (data);
              string s = reader.ReadToEnd ();
              //"s" now contains your entire html page source
              data.Close ();
              reader.Close ();
      

      那么就像isc-fausto说的,可以根据需要使用正则表达式解析输出。

      【讨论】:

      • 此应用程序需要支持任何 URL。由于网页不遵循相同的模式,我不确定解析器是否有可能智能地去除“不相关”的数据
      • 尝试使用正则表达式来解析 HTML 可能真的很麻烦和令人沮丧。如果可以,请使用 HTML Agility Pack - 它是一个 DOM 解析器,这确实是您从 HTML 中提取文本所需要的。
      • 敏捷包适用于何处?我使用史蒂夫的代码来获取 HTML 并通过包运行它以去除 html 标签和不相关的内容并获得纯文本?敏捷包中是否有内置方法可以做到这一点?谢谢
      • 我想我对敏捷包如何适应感到困惑。一旦我从您的代码中获得了 HTML,我如何使用该包来获取“相关”文本内容?
      • -1 因为你不是 using 和 -1 甚至考虑使用正则表达式解析 HTML
      【解决方案5】:

      文本摘要技术可能是您所追求的。但作为一个粗略的启发式方法,只要您不总是指望 100% 完美的结果,您就可以通过一些相对简单的步骤来做到这一点。

      只要您不需要支持单词之间没有空格的书写系统(中文、日文),您可以通过查找带有您将花费几天时间调整的任意阈值。 (除了这个启发式,中文和日文还需要一个合理的断词识别算法)。

      我会从 HTML 解析器开始(Dotnet 中的 HTML 敏捷包,或者像 Ruby 的 Nokogiri 或 Python 的 BeautifulSoup,如果您想在提交 C# 解决方案之前在更具交互性的环境中试验这些算法)。

      为了减少搜索空间,使用 HTML 解析器的功能,使用很少或没有周围文本的链接序列。这应该消除大多数导航面板和某些类型的广告。您可以进一步扩展它以查找后面有单词但没有标点符号的链接;这将消除描述性链接。

      如果您开始看到后跟“。”的文本运行。或“,”,例如 5 个或更多单词(您可以稍后尝试调整),您将开始将其作为潜在的句子或句子片段进行评分。当您连续找到多个运行时,这很有可能成为页面中最重要的部分。你可以给带有<p>标签的文本评分更高一点。一旦你有相当数量的这些类型的序列,你就有“内容”而不是布局铬的可能性很大。

      这并不完美,您可能需要添加一种机制来根据您定期扫描的有问题的页面结构调整启发式方法。但是,如果您基于这种方法构建一些东西,它应该为您的 80% 左右的内容提供相当合理的结果。

      如果您发现这种方法不合适,您可能希望将贝叶斯概率或隐马尔可夫模型作为改进结果的一种方法。

      【讨论】:

        【解决方案6】:

        一旦你有了网页的 html 代码,你就可以使用正则表达式

        【讨论】:

        猜你喜欢
        • 2014-01-03
        • 2013-05-16
        • 2017-02-07
        • 2012-02-25
        • 2016-10-14
        • 1970-01-01
        • 2012-05-10
        • 2011-03-01
        • 2012-04-17
        相关资源
        最近更新 更多