2010-02-13 63 views
9

我正在尋找一種可靠的方式來在ASP.NET/C#中提供給定網址的文本。任何人都可以指出正確的方向嗎?從ASP.NET中的URL獲取文本

此外,網址可能會說一個新聞網站,可能有很多廣告和菜單等。我需要一些智能的方式提取只有相關的內容。不確定如何做到這一點,我將如何定義什麼是相關性?

我應該從RSS提要中讀取嗎?對此有何想法?

編輯 我已經添加了賞金。我正在尋找從URL中提取「相關」的文本。從「相關」我的意思是,它應該排除廣告文字(和其他不相關的信息)。輸入將類似於新聞網站。我需要提取唯一的新聞信息和擺脫外來文字

+1

HTML敏捷包在這裏有幫助嗎? – 2010-02-13 02:48:58

回答

4

一旦你已經下載的頁面,並使用類似HTML敏捷性包庫來解析HTML開始,那麼你的工作開始了:)

屏幕抓取分爲兩部分。

首先是網絡爬蟲(網絡上有很多這方面的信息,以及其他一些答案中提供了WebClient的簡單代碼)。抓取工具必須遍​​歷鏈接並下載頁面。如果你正在下載很多頁面,並有開始url,你可以推出你自己的,或使用現有的。查看Wikipedia獲取開源網絡爬蟲/蜘蛛的列表。

第二部分是解析html,只提取您想要的文本,並省略任何噪音(標題,橫幅,頁腳等)。只要遍歷DOM對於現有的庫來說很容易,搞清楚解析什麼是困難的部分。

我已經在另一個SO question之前寫了一些關於它的內容,它可能會給你一些想法,如何手動獲取你想要的內容。根據我的經驗,沒有100%的方法可以找到頁面的主要內容,而且往往不需要手動給它一些指示。困難的部分是,如果頁面的html佈局改變,那麼你的屏幕刮板將開始失敗。

您可以應用統計數據和比較幾個頁面的html,以推斷廣告,菜單等在哪裏,以消除這些。

既然您提到了新聞網站,與從原始html解析出文本相比,還有其他兩種方法更容易應用於這些網站。

  1. 檢查頁面是否有打印網址。例如。 CNN上的鏈接具有相當容易解析的打印網址。
  2. 檢查頁面是否有RSS表示,然後從RSS提要中選擇文章文本。如果Feed沒有全部內容,它應該給您足夠的文本以在完整的HTML頁面中查找文本。

還檢查出The Easy Way to Extract Useful Text from Arbitrary HTML輸入到如何創建更一般的解析器。代碼是用Python編寫的,但你應該可以轉換它而不會有太多的麻煩。

-4

一旦你的網頁的HTML代碼,您coud使用正則表達式

+1

類似於「\ w +」 – 2010-02-13 03:44:34

+4

用正則表達式解析HTML是不可能的。不要浪費你的時間。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-04-06 13:39:29

0

爲了得到實際的HTML標記,請嘗試Web客戶端目的。像這樣的東西將讓你的標記:

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-福斯托說,你可以使用正則表達式根據需要解析輸出。

+0

任何URL都需要這個應用程序的支持。由於網頁不遵循相同的模式,我不確定分析器是否可以智能地去除「不相關」的數據 – Nick 2010-02-13 03:31:09

+2

試圖使用正則表達式來解析HTML可能會非常多毛和令人沮喪。如果可以,請使用HTML敏捷包 - 它是一個DOM解析器,這是您從HTML中提取文本所需的真正東西。 – 2010-02-13 05:53:50

+0

敏捷包在哪裏適合?我使用史蒂夫的代碼來抓取HTML並通過包運行它去除html標籤和不相關的內容並獲得純文本?敏捷軟件包中是否有內置的方法來執行此操作?謝謝 – Nick 2010-02-14 13:51:42

3

我想你需要一個HTML解析器像HTMLAgilityPack或者您可以使用新出生的嬰兒.. YQL,它的一個新的工具,通過雅虎開發其語法是這樣的SQL,你需要XPATH一知半解......

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

感謝

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 
+0

很高興在這裏看到一些VB。但是,我會注意到,問題中存在C#標記。如果您同時提供這兩個選項,您可能會得到更多的選票。 – Armstrongest 2010-04-12 20:35:35

+0

@Atomiton http://codechanger.com – 2010-04-13 13:10:17

0

文字摘要技術就是你可能以後的事情。但是,作爲一個粗略的啓發式方法,只要你不總是在100%完美的結果上,你可以用一些相對簡單的步驟來做到這一點。

只要您不需要支持在單詞(中文,日文)之間沒有空格的書寫系統,您可以通過查找連續單詞序列的第一對一個任意的閾值,你會花幾天時間調整。 (除了這種啓發式之外,中文和日文將需要合理的分詞識別算法)。

我會從一個HTML解析器(Dotnet中的HTML敏捷包,或者類似於Ruby的Nokogiri或Python的BeautifulSoup,如果您想在提交C#解決方案之前在更多交互式環境中嘗試算法)開始的。

爲了減少搜索空間,使用HTML解析器的功能來減少周圍文本很少或沒有的鏈接序列。這應該會消除大多數導航面板和某些類型的廣告。你可以進一步擴展它來尋找鏈接後面有文字但沒有標點的鏈接;這將消除描述性鏈接。

如果您開始看到文本後面跟着「。」。或者「,」用5個或更多的單詞(你可以稍後嘗試調整),你會開始將它評分爲潛在句子或句子片段。當你連續發現多次運行時,這個頁面最重要的部分具有相當好的可能性。你可以用它周圍的<p>標籤評分得高一點。一旦你有相當數量的這些類型的序列,你有「內容」而不是佈局鑲邊的可能性很大。

這不是完美的,您可能需要添加一種機制來根據您經常掃描的有問題的頁面結構調整試探法。但是,如果您基於這種方法構建了某些內容,則應該爲您的內容的80%左右提供相當合理的結果。

如果您發現這種方法不足,您可能需要查看貝葉斯概率或隱馬爾可夫模型作爲改進結果的一種方式。