HtmlAgilityPack C # --- Selectnodes Siempre devuelve un valor nulo

c# html-agility-pack html-parsing xpath

Pregunta

Este es el texto de xpath que intenté usar junto con el analizador C # HtmlAgilityPack.

//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']

Intenté evaluar la expresión xpath con firefox xpath add = on y obtuve con éxito los elementos necesarios. Pero el código c # devuelve una excepción nula.

HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");            
MessageBox.Show(node.ToString());

el nodo siempre contiene un valor nulo ... Por favor, ayúdeme a encontrar la manera de solucionar este problema ... Gracias ...

Respuesta popular

DOM requiere <tbody/> etiquetas para ser insertado

Todas las extensiones de navegador comunes para construir expresiones XPath funcionan en el DOM. Al contrario de las especificaciones HTML, las especificaciones DOM requieren que los elementos <tr/> estén dentro de los elementos <tbody/> , por lo que los navegadores agregan dichos elementos si faltan. Puede ver fácilmente la diferencia si mira la fuente HTML usando Firebug (o herramientas de desarrollador similares que trabajan en el DOM) en lugar de mostrar la fuente de la página (usando wget o herramientas similares que no interpretan nada si es necesario).

La solución

Elimine el paso del eje /tbody , y su expresión XPath probablemente funcionará.

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

Si necesita admitir etiquetas HTML con y sin <tbody/>

Para una solución más general, podría reemplazar el paso del eje /tbody por un paso // decendante o yo mismo, pero esto podría saltar a "tablas internas":

//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']

Mejor sería usar expresiones XPath alternativas:

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt'] 

Una solución más limpia solo para XPath 2.0 sería

//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué