Ottieni collegamenti in classe con il pacchetto di agilità html

c# html-agility-pack

Domanda

Ci sono un sacco di tr con la classe alt. Voglio ottenere tutti i collegamenti (o il primo degli ultimi), ma non riesco a capire come con il pacchetto di agilità HTML.

Ho provato le varianti di un ma ho solo tutti i link o nessuno. Non sembra avere solo quello nel nodo che non ha senso dal momento che sto scrivendo n.SelectNodes

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

Risposta accettata

Puoi usare LINQ:

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

Nota che questo corrisponderà anche a <tr class="Malto"> ; potresti voler sostituire la chiamata Contains con un'espressione regolare.

Puoi anche usare Fizzler :

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

Si noti che entrambi i metodi restituiranno anchors che non sono collegamenti.


Risposta popolare

Perché non selezionare tutti i collegamenti in una singola query:

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

È valido per HTML:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché