2010-05-18 41 views
13

Hay un montón de tr con la clase alt. Quiero obtener todos los enlaces (o el primero de la última) pero no puedo entender cómo con el paquete de agilidad html.Obtener enlaces en clase con html agility pack

Probé variantes de un pero solo obtengo todos los enlaces o ninguno. Eso no parece solamente conseguir el uno en el nodo que no tiene sentido, ya que estoy escribiendo n.SelectNodes

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

puede mostrar un fragmento de la html que está tratando de analizar? No estoy del todo claro en lo que intentas hacer – jaltiere

+0

@jaltiere: Quiere el selector de CSS 'tr.alt a'. – SLaks

Respuesta

15

Puede utilizar LINQ:

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

Tenga en cuenta que esto también coincidirá <tr class="Malto">; Es posible que desee reemplazar la llamada Contains con una expresión regular.

También es posible usar Fizzler:

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

Tenga en cuenta que ambos métodos también volverán anclas que no son enlaces.

11

Por qué no seleccionar todos los eslabones de consulta única:

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

Es válida para html:

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