Traverse DOM con HTML Agility Pack

.net asp.net c# html html-agility-pack

Pregunta

Estoy analizando un DOM HTML en C # con la biblioteca HTMLAgilityPack y me gustaría saber cómo atravesar el DOM una vez que llegue a un elemento específico.

Por ejemplo, cuando llego al td con una clase de "alguna clase", quiero ir al tercer hermano td y agarrar el href de su anchor anidada.

<td class="some-class">Content I care about</td>
<td>Content I don't want</td>
<td>Content I don't want</td>
<td>    
    <a href="http://www.the-url-I-want.com">Some Amazing URL</a>
</td>

Actualmente, estoy aterrizando en la td que quiero a través de:

foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    HtmlAttribute nodeClass = node.Attributes["class"];

    if(nodeClass != null && nodeClass.Value == "some-class")
    {
        //Find the anchor that is 3 siblings away
        //Do something
    }
}

¿Alguien sabe cómo usaría el paquete HTMLAgility para agarrar el ancla relacionado para el td individual?

Respuesta popular

Aprende XPath y tu trabajo puede ser mucho más fácil. Por ejemplo, para obtener el elemento <td> que tiene atributo de clase es igual a "alguna clase", podemos usar este Xpath:

//td[@class='some-class']

Y para obtener el tercer hermano siguiente <td> :

/following-sibling::td[3]

Por lo tanto, tu bucle se puede reescribir como sigue:

var xpath = "//td[@class='some-class']/following-sibling::td[3]/a";
foreach(HtmlNode a in doc.DocumentNode.SelectNodes(xpath))
{
    //Do something with the anchor variable a
}

Por cierto, una forma más segura de obtener el valor del atributo es usar el método GetAttributeValue() :

var href = a.GetAttributeValue("href", "");

el segundo argumento es el valor predeterminado que se devolverá cuando no se encuentre el atributo.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow