Sélectionner tous les éléments DOM avec HTMLAgilityPack

.net c# dom html html-agility-pack

Question

J'ai examiné des questions similaires et cherché en ligne, mais je n'arrive pas à trouver de solution. Ce que j'essaie de faire est de sélectionner tous les éléments du DOM dans l’ordre (etc.), puis de les mettre dans un répertoire ou quelque chose du genre.

actuellement j'ai

public void Parse()
    {
        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

        // There are various options, set as needed
        //htmlDoc.OptionFixNestedTags = true;

        // filePath is a path to a file containing the html
        htmlDoc.Load("Test.html");

        // Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)

        // ParseErrors is an ArrayList containing any errors from the Load statement
        if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
        {
            Console.WriteLine("There was an error parsing the HTML file");
        }
        else
        {
            if (htmlDoc.DocumentNode != null)
            {
                htmlDoc.DocumentNode.Descendants();

                Console.WriteLine("document node not null");
                //HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

                foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
                {
                    Console.WriteLine(node.Name);
                }
            }
        }
    }

Le code out affiche le nom du noeud (html, title, image, etc.) mais génère les balises de fermeture sous la forme "#text". Je suppose que cela est dû au fait que les balises commencent par un "/". Comment puis-je obtenir une lecture correcte de tous les éléments DOM?

Réponse acceptée

"#text" est le nom des noeuds de texte et les balises de fermeture ne sont pas représentées comme étant uniques dans le DOM.

<div><span>foo</span> bar</div>

Vous donnera un arbre comme

<div><span>foo</span> bar</div>

Réponse populaire

Je soupçonne #text éléments #text que vous avez vus sont des sauts de ligne plutôt que des balises fermantes. Par exemple cette entrée HTML:

<div>
    <a href="http://example.org"></a>
</div>

en utilisant votre code va sortir:

<div>
    <a href="http://example.org"></a>
</div>

Vous pouvez utiliser cette requête XPath à la place pour obtenir tous les éléments qui ne sont pas des nœuds de texte en clair (en sautant ces sauts de ligne inutiles):

<div>
    <a href="http://example.org"></a>
</div>

Cela signifie que XPath sélectionne tous les descendants de l’élément courant ayant un nom quelconque ( * ).




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi