Найти родительский div определенного текста в HTMLDocument

.net html-agility-pack

Вопрос

Я хотел бы вернуть полный InnerText div, где внутри находится определенный текст.

Например: Я ищу «hello world» в HTMLDocument (HTMLAgilityPack) и хочу вернуть полный InnerText из div, где был найден «мир привет».

Вот что я пробовал:

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

Это вернуло HtmlNode, где был найден конкретный текст.

Теперь я хочу, чтобы первый родительский div текстовогоNode возвращал полный InnerText.

заранее спасибо

Принятый ответ

Это сделало бы это, я думаю ...

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

И это, вероятно, еще лучшее решение:

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

или использовать нотацию Linq-to-XML:

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

Или

        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;

Популярные ответы

Хотя у меня нет опыта работы с HTMLAgilityPack, это похоже на синтаксис XPath. В этом случае «..» должен возвращать родительский элемент найденного элемента.

Я использовал этот сайт для тестирования этого: http://ponderer.org/download/xpath/

Если вы введете

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

в текстовом поле выделяется div, содержащий элемент ul (который содержит элемент li) зеленым цветом.

Это то, что ты искал?



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow