2010-05-18 1 views
13

Es gibt eine Reihe von trs mit der Klasse alt. Ich möchte alle Links (oder die erste der letzten) bekommen, aber ich kann nicht herausfinden, wie mit HTML Agilität Pack.Holen Sie sich Links in der Klasse mit HTML Agility Pack

Ich versuchte Varianten von a, aber ich bekomme nur alle Links oder keine. Es scheint tut nur das eine im Knoten zu erhalten, die keinen Sinn macht, da ich n.SelectNodes schreibe

html.LoadHtml(page); 
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']"); 
foreach (var n in nS) 
{ 
    var aS = n.SelectNodes("a"); 
    ... 
} 
+0

können Sie zeigen einen Ausschnitt des HTML Sie zu analysieren versuchen? Ich weiß nicht genau, was Sie zu tun versuchen – jaltiere

+0

@jaltiere: Er möchte den CSS-Selektor 'tr.alt a'. – SLaks

Antwort

15

Sie können LINQ verwenden:

var links = html.DocumentNode 
      .Descendants("tr") 
      .Where(tr => tr.GetAttributeValue("class", "").Contains("alt")) 
      .SelectMany(tr => tr.Descendants("a")) 
      .ToArray(); 

Beachten Sie, dass dies auch <tr class="Malto"> übereinstimmen; Vielleicht möchten Sie den Contains Aufruf durch eine Regex ersetzen.

Sie könnten auch Fizzler verwenden:

html.DocumentNode.QuerySelectorAll("tr.alt a"); 

Beachten Sie, dass beide Methoden auch Anker zurück, die keine Links sind.

11

Warum wählen Sie nicht alle Links in einzelnen Abfrage:

html.LoadHtml(page); 
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']//a"); 
foreach(HtmlNode linkNode in nS) 
{ 
//do something 
} 

Es ist gültig für html:

<table> 
<tr class = "alt"> 
<td><'a href="link.html">Some Link</a></td> 
</tr> 
</table> 
Verwandte Themen