XPath "No". Ignorar ramas con una etiqueta específica

html-agility-pack xpath

Pregunta

He cargado una página web en el paquete de agilidad HTML y tengo un DOM. Quiero usar XPATH para extraer todo el texto de la página (pero no el javascript que se encuentra dentro de las etiquetas <script> ).

Supongo que necesito un // texto () y luego un 'no' para ignorar cualquier etiqueta dentro de la rama que tiene un <script> .

Yo he tratado

doc.DocumentNode.SelectNodes("//text()[not(self::script)]"))

y

doc.DocumentNode.SelectNodes("//text()[not(script)]"))

pero tampoco trabajo. Un ejemplo de la propiedad XPath de un nodo que devuelven es (observe el Script)

/html[1]/body[1]/div[2]/div[4]/div[1]/div[1]/div[1]/div[3]/script[1]/#text[1]

He consultado con estos dos puestos.

¿Es posible hacer 'no' coincidir en XPath?

Agarra todo el texto de html con Html Agility Pack (esta es una buena publicación pero saca el JS)

¿Alguna sugerencia?

Respuesta aceptada

Su primer intento rechaza todos los nodos de texto que son elementos de script, y su segundo rechaza todos los nodos de texto que tienen hijos de nodo de script. Por supuesto, en ambos casos, la condición nunca es cierta.

No ha explicado claramente sus requisitos, pero supongo que desea rechazar todos los nodos de texto que tienen elementos de script como su principal, lo que sería

//text()[not(parent::script)]

o

//*[not(self::script)]/text()


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é