在HTMLDocument中查找特定文本的父div

.net html-agility-pack

我想返回div的完整InnerText,其中包含特定文本。

例如:我在HTMLDocument(HTMLAgilityPack)中搜索“hello world”,并希望返回找到“hello world”的div的完整InnerText。

这是我试过的:

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

这返回了找到特定文本的HtmlNode。

现在我想获得textNode的第一个父div以返回完整的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')]/../..

在文本框中,它将突出显示包含绿色的ul元素(包含li元素)的div。

这是你在寻找什么?




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因