2012-08-26 66 views
0

我試圖找到鏈接到某個域的頁面上的任何鏈接,然後獲取鏈接href標記。抓取鏈接到某個網站的錨元素

目前,我這樣做:

foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']")) 
{ 
    MessageBox.Show(imageLink.InnerHtml); 
} 

但我發現了此異常:

對象引用不設置到對象的實例。

我也嘗試//a[@href=*site.com*]沒有運氣,它說這是一個無效的標記。

什麼是XPath表達式,我需要找到鏈接到某個域的頁面上的任何鏈接?另外,我將如何去解壓縮它們的href屬性(如果可能,在同一個XPath表達式中)。

謝謝。

回答

0

的XPath有一個contains方法,所以它是那麼容易,因爲這樣的:

var urls = new List<Uri>(); 
var url = new Uri("http://stackoverflow.com/questions/12131954/"); 
using (var client = new WebClient()) 
{ 
    var doc = new HtmlDocument(); 
    doc.Load(client.OpenRead(url)); 
    var links = doc.DocumentNode.SelectNodes("//a[contains(@href,'stackoverflow.com')]"); 
    foreach (var link in links) 
    { 
    var uri = new Uri(url, link.Attributes["href"].Value); //fixes relative Urls 
    if (uri.Scheme.StartsWith("http")) 
    { 
     urls.Add(uri); 
    } 
    } 
    Console.WriteLine(urls); 
} 

或者你可以使用Linq用於獲取鏈接

var links = doc.DocumentNode.Descendants("a") 
    .Where(a => a.Attributes["href"] != null 
     && a.Attributes["href"].Value.ToLower().Contains("stackoverflow.com")); 

而且好像你是從匹配子節點,如果你想使用相同的XPath你必須在字符串.//a[]

+0

乾杯年初增加一個點,包含似乎正是我需要的:)不過,WH恩我用'//一個[包含(@ HREF,「site.com」)'我得到一個無效的令牌例外。 –

+0

嗯,它適用於我很好,我的代碼張貼工作嗎?如果沒有,您使用的是什麼版本的Agility Pack? – shriek

+0

等待,所述的xpath必須是'//a[contains(@href,'site.com')]',你丟失一個']'。 – shriek