2010-05-18 8 views
13

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.Ottieni collegamenti in classe con il pacchetto agility html

Ho provato le varianti di un ma ottengo solo tutti i collegamenti o nessuno. Non sembra per ottenere solo quella 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"); 
    ... 
} 
+0

può mostrare un frammento del HTML si sta tentando di analizzare? Non sono del tutto chiaro su cosa stai cercando di fare – jaltiere

+0

@jaltiere: Vuole che il selettore CSS 'tr.alt a'. – SLaks

risposta

15

È possibile utilizzare LINQ:

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

Si noti che questo sarà anche corrispondere <tr class="Malto">; si consiglia di sostituire la chiamata Contains con un'espressione regolare.

Si potrebbe anche usare Fizzler:

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

Si noti che entrambi i metodi saranno anche restituire ancore che non sono collegamenti.

11

Perché non selezionare tutti i collegamenti in singola query:

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

E 'valida per html:

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