как получить доступ к дочернему узлу из узла в пакете htmlagility - PullRequest
17 голосов
/ 08 июня 2011
<html>
    <body>
        <div class="main">
            <div class="submain"><h2></h2><p></p><ul></ul>
            </div>
            <div class="submain"><h2></h2><p></p><ul></ul>
            </div>
        </div>
    </body>
</html>

Я загрузил HTML в HtmlDocument. Затем я выбрал XPath как submain. Тогда я не знаю, как получить доступ к каждому тегу, т. Е. h2, p в отдельности.

HtmlAgilityPack.HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class=\"submain\"]");
foreach (HtmlAgilityPack.HtmlNode node in nodes) {}

Если я использую node.InnerText, я получаю все тексты, и InnerHtml также бесполезен. Как выбрать отдельные теги?

Ответы [ 3 ]

30 голосов
/ 10 июня 2011

Поможет следующее:

HtmlAgilityPack.HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class=\"submain\"]");
foreach (HtmlAgilityPack.HtmlNode node in nodes) {
    //Do you say you want to access to <h2>, <p> here?
    //You can do:
    HtmlNode h2Node = node.SelectSingleNode("./h2"); //That will get the first <h2> node
    HtmlNode allH2Nodes= node.SelectNodes(".//h2"); //That will search in depth too

    //And you can also take a look at the children, without using XPath (like in a tree):        
    HtmlNode h2Node = node.ChildNodes["h2"];
}
4 голосов
/ 14 декабря 2013

Вы ищете потомков

var firstSubmainNodeName = doc
   .DocumentNode
   .Descendants()
   .Where(n => n.Attributes["class"].Value == "submain")
   .First()
   .InnerText;
2 голосов
/ 08 июня 2011

По памяти я считаю, что каждый Node имеет свою собственную коллекцию ChildNodes, поэтому в вашем блоке for…each вы сможете проверить node.ChildNodes.

...