Rufen Sie den HtmlAgilityPack-Knoten mit exakter HTML-Suche oder HTMLElement in HTMLNode konvertieren ab

browser c# html-agility-pack

Frage

Ich habe einen HTMLElement-Picker (DOM) mithilfe des Standard-Webbrowsers ".net" erstellt. Der Benutzer kann ein HTMLElement auswählen (auswählen), indem er darauf klickt.

Ich möchte den HtmlAgilityPack.HTMLNode erhalten, der dem HTMLElement entspricht.

Der einfachste Weg (in meinen Gedanken) ist doc.DocumentNode.SelectSingleNode (EXACTHTMLTEXT), aber es funktioniert nicht wirklich (weil die Funktion nur Xpath-Code akzeptiert).

Wie kann ich das machen?

Ein von einem Benutzer ausgewähltes HTMLElement-Beispiel sieht so aus (The OuterHtml Code):

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

Natürlich kann jedes Element ausgewählt werden, deshalb brauche ich eine Möglichkeit, den HTMLNode zu bekommen.

Akzeptierte Antwort

Das gleiche Konzept, aber ein bisschen einfacher, weil Sie den Elementtyp nicht kennen müssen:

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

Beliebte Antwort

Ich habe eine Lösung gefunden. Ich weiß nicht, ob es das Beste ist (ich würde mich freuen, wenn jemand einen besseren Weg kennt, dies zu tun, um es mich wissen zu lassen).

Hier ist die Klasse, die den HTMLNode bekommt:

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 <");
            }
        }

Die Idee ist, dass Sie den OuterHtml des HtmlElement übergeben. Beispiel:

HtmlElement el=....
HtmlNode N = GetNode(el.OuterHtml);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum