usar parser htmlagilitypack expressions examples como agility c# html visual-studio xpath html-agility-pack

c# - parser - XPath/HtmlAgilityPack: ¿Cómo encontrar un elemento(a) con un valor específico para un atributo(href) y encontrar columnas de tabla adyacentes?



htmlagilitypack load url (2)

Estoy bastante desesperado porque no puedo entender cómo lograr lo que dije en la pregunta. Ya leí innumerables ejemplos similares, pero no encontré ninguno que funcione en la situación exacta. Entonces, digamos que tengo el siguiente código:

<table><tr> <td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td> <td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td> <td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td> </tr></table>

Ahora, lo que ya tengo es una parte de url-a. Básicamente quiero saber cómo puedo obtener una identificación A e img A. Estoy tratando de "encontrar" la línea con XPath, pero no puedo encontrar la manera de hacerlo funcionar. Además, es posible que la información no esté presente en absoluto. Este es mi último intento (en serio, he jugado con esto durante más de 3 horas y ahora pruebo de diferentes maneras):

if (htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, ''part-url-a'')]") != null) string ida = htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, ''part-url-a'')]/following-sibling::a").InnerText;

Bueno, aparentemente está mal como el infierno así que estaría muy contento si alguien pudiera ayudarme aquí. También agradecería que alguien me señale algún sitio web que explique XPath y las notaciones / sintaxis en detalle con ejemplos como este. Los libros también son bienvenidos.

PD: Sé que podría lograr mi objetivo sin XPath en absoluto con Regex o simplemente un StreamReader en C # y comprobando si cada línea contiene lo que necesito, pero a) es demasiado frágil para mis necesidades porque el código podría tener saltos de línea abruptos yb) Realmente quiero mantenerme consistente con apegarme por completo a XPath por cualquier cosa que haga en este proyecto.

¡Gracias de antemano por tu ayuda!


Usted tiene un HTML seriamente roto con etiquetas td cierre no coincidentes. Solucionarlos por favor. Es solo una imagen fea de este marcado.

Dicho esto, con suerte Html Agility Pack puede manejar cualquier mierda que le arroje, así que aquí está cómo proceder y analizar la basura que tiene y encontrar los valores id y img dado el href :

class Program { static void Main() { var doc = new HtmlDocument(); doc.Load("test.html"); var anchor = doc.DocumentNode.SelectSingleNode("//a[contains(@href, ''url-a'')]"); if (anchor != null) { var id = anchor.ParentNode.SelectSingleNode("following-sibling::td/a"); if (id != null) { Console.WriteLine(id.InnerHtml); var img = id.ParentNode.SelectSingleNode("following-sibling::td/a"); if (img != null) { Console.WriteLine(img.InnerHtml); } } } } }


Use las siguientes expresiones XPath :

/*/tr/td[a[@href=''url-a'']] /following-sibling::td[1] /a/text()

Cuando se evalúa con el documento XML proporcionado (mal formado pero corregido) :

<table><tr> <td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td> <td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td> <td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td> </tr></table>

el nodo de texto deseado está seleccionado :

id A

Del mismo modo, esta expresión XPath :

/*/tr/td[a[@href=''url-a'']] /following-sibling::td[2] /a/text()

cuando se evalúa con el mismo documento XML (arriba), selecciona el otro nodo de texto deseado :

img A

Verificación basada en XSLT :

Cuando se aplica esta transformación en el documento XML (arriba):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:copy-of select= "/*/tr/td[a[@href=''url-a'']] /following-sibling::td[1] /a/text()"/> <xsl:text>&#10;</xsl:text> <xsl:copy-of select= "/*/tr/td[a[@href=''url-a'']] /following-sibling::td[2] /a/text()"/> </xsl:template> </xsl:stylesheet>

los resultados buscados son producidos :

id A img A