Obtenez des liens en classe avec le pack d'agilité HTML

c# html-agility-pack

Question

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.

J'ai essayé des variantes d'un mais je ne reçois que tous les liens ou aucun. Il ne semble pas y avoir que celui du nœud, ce qui n’a aucun sens puisque j’écris n.SelectNodes

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

Réponse acceptée

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 cela correspondra également à <tr class="Malto"> ; vous souhaiterez peut-être remplacer l'appel Contains par une expression régulière.

Vous pouvez également utiliser Fizzler :

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

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


Réponse populaire

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

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

C'est valable pour le HTML:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi