从ASP.NET中的URL获取文本

时间:2010-02-13 02:47:35

标签: c# asp.net

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

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

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

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

6 个答案:

答案 0 :(得分:4)

下载页面后,开始使用HTML Agility Pack等库来解析html,然后开始工作:)

屏幕抓取分为两部分。

首先是webcrawler(网上有很多关于此的信息,以及其他一些答案提供的WebClient简单代码)。爬虫必须遍历链接和下载页面。如果您要下载大量页面并拥有起始URL,则可以自行滚动或使用现有页面。查看Wikipedia以获取开源webcrawler / spider的列表。

第二部分是解析html并只提取你想要的文本,并省略任何噪音(标题,横幅,页脚等)。只需遍历DOM就可以轻松使用现有的库,弄清楚如何处理解析的内容是困难的部分。

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

您可以应用统计信息并比较几个页面的html,以便推断广告,菜单等的位置,以便消除这些。

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

  1. 检查页面是否有打印网址。例如。 CNN上的链接有一个等效的打印网址,更容易解析。
  2. 检查页面是否有RSS表示,然后从RSS源中选择文章文本。如果Feed没有所有内容,它应该为您提供足够的文本以在完整的html页面中找到文本。
  3. 另请查看The Easy Way to Extract Useful Text from Arbitrary HTML以获取有关如何创建更通用解析器的输入。代码在Python中,但你应该能够毫不费力地转换它。

答案 1 :(得分:3)

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

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

感谢

答案 2 :(得分:2)

使用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

答案 3 :(得分:0)

为了获得实际的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所说,你可以使用正则表达式来根据需要解析输出。

答案 4 :(得分:0)

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

只要您不需要支持在单词(中文,日文)之间没有空格的书写系统,您可以通过查找连续单词序列的前几次运行来获得相当好的结果。任意阈值,你将花几天时间调整。 (除了这种启发式,中文和日文还需要合理的分词识别算法)。

我将从HTML Parser(Dotnet中的HTML Agility Pack,或Ruby的Nokogiri或Python的BeautifulSoup之类的东西开始,如果你想在更加交互的环境中试验算法,然后再提交你的C#解决方案)。

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

如果您开始看到文本后跟“。”。或“,”或者说,5个或更多的单词(您可以稍后尝试调整),您将开始评分为潜在的句子或句子片段。当你发现连续几次运行时,它几乎是成为页面最重要部分的几率。您可以使用<p>周围的标签对文本进行评分。一旦你有相当数量的这些类型的序列,你有“内容”而不是布局铬的可能性非常大。

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

如果您发现这种方法不合适,您可能需要查看贝叶斯概率或隐马尔可夫模型作为改善结果的方法。

答案 5 :(得分:-4)

获得网页html代码后,您可以使用正则表达式