2010-02-11 135 views
36

我正在一個小愛好項目上工作。我已經編寫了代碼來獲取URL,下載標題並返回MIME類型/內容類型。獲取HTML網頁上的所有鏈接

然而,在此之前的一步是一個IM卡 - 我需要找回基於標籤內頁上的所有URL的內容,並在引號,即

... 
<link rel='shortcut icon' href="/static/favicon.ico" type="image/x-icon" /> 
... 

會發現圖標鏈接。

在.net庫中有沒有什麼有用的東西,或者這將不得不成爲正則表達式的情況?

+11

我得到一個奇怪的感覺,在HTML敏捷性包是去... – jball 2010-02-11 23:01:35

回答

54

我會看看使用Html Agility Pack

這裏有一個例子直接從他們的榜樣頁面上如何找到一個頁面中的所有鏈接:

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(/* url */); 
foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]")) 
{ 

} 
+0

XPath的安永的方式演示 - 我喜歡它! – maxp 2010-02-11 23:05:54

+4

'DocumentElement'應該替換爲'DocumentNode' – HadiRj 2015-10-06 06:12:15

+0

只是想補充一點,如果你試圖加載的網站有一些gzip壓縮,它會在'hw.Load'上拋出一個異常:''''gzip'不是支持的編碼名稱有關定義自定義編碼的信息,請參閱Encoding.RegisterProvider方法的文檔。找到解決方法[此處](https://stackoverflow.com/a/36220920/6178243) – 2017-06-20 20:16:19

14

沒有內置到BCL什麼,但幸運的是,你可以使用HTML Agility Pack做到這一點任務很簡單。

至於你的具體問題,請參閱Easily extracting links from a snippet of html with HtmlAgilityPack

private List<string> ExtractAllAHrefTags(HtmlDocument htmlSnippet) 
{ 
    List<string> hrefTags = new List<string>(); 

    foreach (HtmlNode link in htmlSnippet.DocumentNode.SelectNodes("//a[@href]")) 
    { 
     HtmlAttribute att = link.Attributes["href"]; 
     hrefTags.Add(att.Value); 
    } 

    return hrefTags; 
} 
+2

這可以完成更簡單的使用LINQ – SLaks 2010-02-11 23:05:55

+5

我不同意基於LINQ的方法比較簡單聲明式是的功能性絕對簡單兩種解決方案的簡單性相同 – 2010-02-11 23:14:51

+0

XPath應該使用較少的內存 – 2014-11-18 18:01:59

31

您需要使用HTML Agility Pack

例如:

var doc = new HtmlWeb().Load(url); 
var linkTags = doc.DocumentNode.Descendants("link"); 
var linkedPages = doc.DocumentNode.Descendants("a") 
            .Select(a => a.GetAttributeValue("href", null)) 
            .Where(u => !String.IsNullOrEmpty(u)); 
相關問題