Encuentra el div padre de un texto específico en un documento HTML

.net html-agility-pack

Pregunta

Me gustaría devolver el texto interior completo de un div donde hay un texto específico dentro.

Por ejemplo: estoy buscando "hola mundo" en HTMLDocument (HTMLAgilityPack) y quiero devolver el texto íntegro del div donde se encontró "hola mundo".

Esto es lo que intenté:

HtmlNode textNode = doc.DocumentNode.SelectNodes("//text()[contains(., 'hello world')]/..")

Esto devolvió el HtmlNode donde se encontró el texto específico.

Ahora quiero obtener el primer div principal del textNode para devolver el texto interno completo.

Gracias por adelantado

Respuesta aceptada

Esto lo haría, creo ...

var nodes2 = doc.DocumentNode.SelectNodes("//div[contains(.//text(), 'Hello World')]");

Y esta es probablemente una solución aún mejor:

var nodes3 = doc.DocumentNode.SelectNodes("//text()[contains(., 'Hello World')]/ancestor::div[1]");

o use la notación de Linq-to-XML:

        var nodes =
            doc.DocumentNode.Descendants("div")
               .Where(
                   div =>
                   div.DescendantsAndSelf("text()").Where(text => text.InnerHtml.Contains("Hello World")).Any())

O

        var nodes4 = from div in doc.DocumentNode.Descendants("div")
                     from text in div.DescendantsAndSelf("text()")
                     where text.InnerText.Contains("Hello World")
                     let firstParent = text.AncestorsAndSelf("div").First()
                     select firstParent;

Respuesta popular

Aunque no tengo experiencia con HTMLAgilityPack, esto parece una sintaxis XPath. En cuyo caso, el ".." debe devolver el elemento primario del elemento encontrado.

Utilicé este sitio web para probar esto: http://ponderer.org/download/xpath/

Si escribes

//li[contains(., 'about')]/../..

en el cuadro de texto, resaltará el div que contiene el elemento ul (que contiene el elemento li) en verde.

Esto es lo que estabas buscando?



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