Я хотел бы вернуть полный 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) зеленым цветом.
Это то, что ты искал?