Seleccione todos los enlaces de una tabla Html usando XPath (y HtmlAgilityPack)

c# html-agility-pack xpath

Pregunta

Lo que estoy tratando de lograr es extraer todos los enlaces con un atributo href que comience con http: //, https: // o /. Estos enlaces se encuentran dentro de una tabla (tbody> tr> td, etc.) con una determinada clase. Pensé que podría especificar solo el elemento a sin todo el camino, pero parece que no funciona. Obtengo una NullReferenceException en la línea que selecciona los enlaces:

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

No sé sobre recomendaciones o mejores prácticas cuando se trata de XPath. ¿Puedo crear una sobrecarga cuando pregunto el documento dos veces?

Respuesta aceptada

Uso :

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

Seguirá teniendo un problema , a menos que corrija su código para reflejar el hecho de que el método de instancia XmlNode.SelectNodes() tiene un tipo de retorno de XmlNodeList , no HtmlNode .


Respuesta popular

El problema es que está seleccionando la tabla e inmediatamente tratando de seleccionar los anclajes como si fueran decentes directos. Hay etiquetas tr y td en el medio.

Entonces, si cambias tu xpath a lo siguiente, las cosas deberían funcionar:

"tbody/tr/td/a[starts-with(@href, 'https://')]"

Esto no funcionará si sus anclas están envueltas en otra cosa, así que podría seleccionar todas las anclas en el conjunto de nodos actual (es decir, tabla):

"//a[starts-with(@href, 'https://')]"

Vea esto para más detalles sobre la sintaxis de xpath.



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