Obtenir le noeud HtmlAgilityPack en utilisant une recherche HTML exacte ou en convertissant HTMLElement en HTMLNode

browser c# html-agility-pack

Question

J'ai créé un sélecteur HTMLElement (DOM) à l'aide du navigateur Web .net par défaut. L'utilisateur peut sélectionner (sélectionner) un objet HTMLElement en cliquant dessus.

Je veux obtenir le HtmlAgilityPack.HTMLNode correspondant à HTMLElement.

Le moyen le plus simple (à mon sens) est d'utiliser doc.DocumentNode.SelectSingleNode (EXACTHTMLTEXT) mais cela ne fonctionne pas vraiment (car la fonction accepte uniquement le code xpath).

Comment puis-je faire ceci?

Un exemple de HTMLElement sélectionné par un utilisateur se présente comme suit (code OuterHtml):

<a onmousedown="return wow" class="l" href="http://site.com"><em>Great!!!</em> <b>come and see more</b></a>

Bien sûr, n'importe quel élément peut être sélectionné, c'est pourquoi j'ai besoin d'un moyen d'obtenir le HTMLNode.

Réponse acceptée

Même concept, mais un peu plus simple car il n'est pas nécessaire de connaître le type d'élément:

HtmlNode n = doc.DocumentNode.Descendants().Where(n => n.OuterHtml.Equals(text, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

Réponse populaire

Je suis venu avec une solution. Je ne sais pas si c'est le meilleur (j'apprécierais que quelqu'un connaisse un meilleur moyen d'y parvenir pour me le faire savoir).

Voici la classe qui obtiendra le HTMLNode:

public HtmlNode GetNode(string text)
        {

            if (text.StartsWith("<")) //get the type of the element (a, p, div etc..)
            {
                string type = "";
                for (int i = 1; i < text.Length; i++)
                {
                    if (text[i] == ' ')
                    {
                        type = text.Substring(1, i - 1);
                        break;
                    }
                }

                try //check to see if there are any nodes of your HTMLElement type that have an OuterHtml equal to the HtmlElement Outer HTML. If a node exist, than that's the node we want to use
                {
                    HtmlNode n = doc.DocumentNode.SelectNodes("//" + type).Where(x => x.OuterHtml == text).First();
                    return n;
                }
                catch (Exception)
                {
                    throw new Exception("Cannot find the HTML element in the HTML Page");
                }
            }
            else
            {
                throw new Exception("Invalid HTML Element supplied. The selected HTML element must start with <");
            }
        }

L'idée est que vous passiez le OuterHtml de HtmlElement. Exemple:

public HtmlNode GetNode(string text)
        {

            if (text.StartsWith("<")) //get the type of the element (a, p, div etc..)
            {
                string type = "";
                for (int i = 1; i < text.Length; i++)
                {
                    if (text[i] == ' ')
                    {
                        type = text.Substring(1, i - 1);
                        break;
                    }
                }

                try //check to see if there are any nodes of your HTMLElement type that have an OuterHtml equal to the HtmlElement Outer HTML. If a node exist, than that's the node we want to use
                {
                    HtmlNode n = doc.DocumentNode.SelectNodes("//" + type).Where(x => x.OuterHtml == text).First();
                    return n;
                }
                catch (Exception)
                {
                    throw new Exception("Cannot find the HTML element in the HTML Page");
                }
            }
            else
            {
                throw new Exception("Invalid HTML Element supplied. The selected HTML element must start with <");
            }
        }



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