2012-12-15 49 views
5

我希望能夠從div內部獲得2個鏈接。HtmlAgilityPack獲取DIV中的所有鏈接

目前我可以選擇一個,但是當它有更多它似乎沒有工作。

HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load(url); 

HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']"); 

      if (node != null) 
      { 
       foreach (HtmlNode type in node.SelectNodes("//[email protected]")) 
       { 
        recipe.type += type.InnerText; 
       } 
      } 
      else 
       recipe.type = "Error fetching type."; 

試圖從這塊HTML中獲得它:

<div class="myclass"> 
<h3>Not Relevant Header</h3> 
    <a href="#">This text</a>, 
    <a href="#">and this text</a> 
</div> 

任何幫助表示讚賞,在此先感謝。

+0

Deejdd,您可能有興趣看到更通用的解決方案,可以在更多情況下成功使用。 –

回答

11
var div = doc.DocumentNode.SelectSingleNode("//div[@class='myclass']"); 
if(div!=null) 
{ 
    var links = div.Descendants("a") 
        .Select(a => a.InnerText) 
        .ToList(); 
} 
+0

經過測試,但對於一些reasen它抓住所選的div以外的所有鏈接, – Deejdd

+0

@Deejdd我更新了答案 –

+3

感謝噸它工作,不能upvote你,因爲沒有足夠的代表。 – Deejdd

3

使用這個XPath:

//div[@class = 'myclass']//a 

它吸引在div所有子孫a元素與class = 'myclass'

//[email protected]不正確的XPath。

+0

工作,謝謝。 – Deejdd

+0

一個小問題,是否有可能這樣做:// div [@class ='half na'] 如果您不知道確切的類名仍然搜索它。 – Deejdd

+0

@Deejdd,你能澄清一下嗎?從你的例子中你知道'@class ='half na''。 –

2

使用

//div[contains(concat(' ', @class, ' '), ' myclass ')]//a 

這將選擇任何a元素是任何div的後裔,其class屬性包含"myclass"一個類名。

該類名可能是單一的,或者該屬性也可能包含其他類名。在這種情況下,類名可能是開始的或最後一個,或者可能被其他類名包圍 - 上述XPath表達式在所有這些不同情況下都正確選擇所需節點。

+0

感謝您發帖,喜歡看不同的搭配來達到同樣的效果。 – Deejdd

+0

@Deejdd,不客氣。您是否注意到這種解決方案比其他答案更強大,更適用?即使某些潛水的「class」屬性的格式爲「class =」class1 myclass class2「」,它也會選擇想要的節點 - 而在所有這些情況下,所有其他答案都無法正確選擇想要的節點。 –

相關問題