Как получить элементы внутри закомментированного кода HtmlAgilityPack в VB.NET

#vb.net #html-agility-pack

#vb.net #html-agility-pack

Вопрос:

Есть ли способ использовать HtmlAgilityPack в html, который находится внутри <!-- --> блоков комментариев? Например, как я могу настроить таргетинг на внутренний текст "//div.[@class='theClass']" , который находится внутри такого блока:

 <!-- <div class="theClass'>Hello I am <span class="theSpan">some text.</span> </div>-->
  

Так что я получаю

 Hello I am some text.
  

Причина, по которой я спрашиваю, заключается в том, что я продолжал обнаруживать, что это продолжает возвращать значение NULL, потому div что они находятся внутри комментариев:

 htmlnodes = htmldoc.DocumentNode.SelectNodes("//div[@class='theClass']")
  

Ответ №1:

К сожалению, XPath обрабатывает содержимое узла комментариев как обычный текст, что означает, что вы не можете запрашивать содержимое так же, как обычные узлы.

Один из возможных способов — проанализировать содержимое узла комментариев как другое HtmlDocument , чтобы вы могли запрашивать из него, например :

 'get desired comment node'
Dim htmlnode As HtmlNode = htmldoc.DocumentNode.SelectSingleNode("//comment()[contains(., theClass)]")

Dim comment As New HtmlDocument()
'remove the outer <!--  --> so we have clean content'
comment.LoadHtml(htmlnode.InnerHtml.Replace("<!--", "").Replace("-->", ""))
'here you can use common XPath query again'
Dim result As HtmlNode = comment.DocumentNode.SelectSingleNode("//div[@class='theClass']")

'following line will print "Hello I am some text."'
Console.WriteLine(result.InnerText)
  

Комментарии:

1. Спасибо. Вышеуказанное работает, и вы ответили на мой вопрос.