2010-05-18 8 views
13

Il y a un tas de tr avec la classe alt. Je veux obtenir tous les liens (ou le premier du dernier) mais je ne peux pas comprendre comment avec le pack d'agilité html.Obtenez des liens en classe avec le pack d'agilité html

J'ai essayé des variantes d'un mais j'ai seulement tous les liens ou aucun. Il ne semble pas seulement obtenir celui du noeud qui n'a pas de sens depuis que je suis en train d'écrire n.SelectNodes

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

peut vous montrer un extrait du code HTML que vous essayez d'analyser? Je ne suis pas tout à fait clair sur ce que vous essayez de faire – jaltiere

+0

@jaltiere: Il veut le sélecteur CSS 'tr.alt a'. – SLaks

Répondre

15

Vous pouvez utiliser LINQ:

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

Notez que ce sera aussi correspondre <tr class="Malto">; vous pouvez remplacer l'appel Contains par une regex.

Vous pouvez également utiliser Fizzler:

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

Notez que les deux méthodes renvoient également des ancres qui ne sont pas des liens.

11

Pourquoi ne pas sélectionner tous les liens dans la requête unique:

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

Il est valable pour html:

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