2012-12-15 85 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“”,它也会选择想要的节点 - 而在所有这些情况下,所有其他答案都无法正确选择想要的节点。 –

相关问题