C # HtmlAgilityPack añadiendo tbody

c# html html-agility-pack xpath

Pregunta

El C # HtmlAgilityPack, agrega el elemento tbody después de la función LoadHtml, en el árbol DOM en las tablas, incluso si no existe en el documento HTML original. ¿Cómo puedo deshabilitar esto?

Mi algoritmo crea algunas expresiones XPATH, al atravesar el árbol de dom y ese elemento tbody no existente dentro del documento original hace que los SelectNodes no encuentren los elementos deseados. Me tomó mucho tiempo resolver esto: |

¿Es posible hacer que los SelectNodes también consideren los nodos agregados por HtmlAgilityPack?

Ejemplo:

<table>
    <tr><td>data</td></tr>
</table>

Mi aplicación produciría este XPATH para extraer 'data': // table / tbody / tr / td

La etiqueta tbody en la expresión se agregó porque está en el árbol DOM después de analizar el código html por HtmlAgilityPack porque HtmlAgilityPack lo agregó incluso si no existe. Por eso

doc.DocumentNode.SelectNodes("//table/tbody/tr/td");

fallaría.

En otras palabras, el elemento tr (HtmlElement) nombre de etiqueta principal es igual a 'TBODY' no 'TABLE'. También estoy analizando muchos sitios web diferentes, así que esta es una situación.

SelectNodes está buscando en el código HTML original, no en el árbol DOM que tiene después de HtmlDocument.LoadHtml, o no considera elementos "virtuales" agregados por él.

Respuesta popular

No tienes que usar la jerarquía completa.

Solo usa lo siguiente si todo lo que quieres es td s:

doc.DocumentNode.SelectNodes("//table//td");

o simplemente ignora el nodo tbody y obtén toda la jerarquía que te interesa:

doc.DocumentNode.SelectNodes("//table//tr/td");


Related

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é