Trouver le div parent d'un texte spécifique dans un HTMLDocument

.net html-agility-pack

Question

Je voudrais renvoyer l'intégralité de InnerText d'une div où se trouve un texte spécifique.

Par exemple: Je recherche "hello world" dans le document HTML (HTMLAgilityPack) et souhaite renvoyer l'intégralité du texte InnerText de la div où "hello world" a été trouvé.

C'est ce que j'ai essayé:

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

Cela a renvoyé le HtmlNode où le texte spécifique a été trouvé.

Maintenant, je veux que le premier div du parent de textNode renvoie l'intégralité de InnerText.

Merci d'avance

Réponse acceptée

Cela ferait je pense ...

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

Et c'est probablement une solution encore meilleure:

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

ou utilisez la notation Linq-to-XML:

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

Ou

        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;

Réponse populaire

Bien que je n’ai pas d’expérience avec HTMLAgilityPack, cela ressemble à la syntaxe XPath. Dans ce cas, le ".." devrait renvoyer le parent de l'élément trouvé.

J'ai utilisé ce site pour tester ceci: http://ponderer.org/download/xpath/

Si vous tapez

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

dans la zone de texte, il mettra en évidence la div contenant l'élément ul (qui contient l'élément li) en vert.

Est ce que c'est ce que vous recherchiez?



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow