Ottieni HtmlAgilityPack Node utilizzando la ricerca HTML esatta o Conversione HTMLElement in HTMLNode

browser c# html-agility-pack

Domanda

Ho creato un selettore HTMLElement (DOM) utilizzando il WebBrowser predefinito .net. L'utente può selezionare (selezionare) un HTMLElement facendo clic su di esso.

Voglio ottenere il HtmlAgilityPack.HTMLNode corrispondente a HTMLElement.

Il modo più semplice (nella mia mente) è usare doc.DocumentNode.SelectSingleNode (EXACTHTMLTEXT) ma non funziona (perché la funzione accetta solo il codice xpath).

Come posso fare questo?

Un esempio di HTMLElement selezionato da un utente assomiglia a questo (Il codice OuterHtml):

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

Naturalmente, qualsiasi elemento può essere selezionato, ecco perché ho bisogno di un modo per ottenere il codice HTML.

Risposta accettata

Stesso concetto, ma un po 'più semplice perché non devi conoscere il tipo di elemento:

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

Risposta popolare

Ho trovato una soluzione. Non so se è il migliore (sarei grato se qualcuno conosca un modo migliore per farlo per farmelo sapere).

Ecco la classe che otterrà il codice HTML:

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'idea è di passare l'OuterHtml di HtmlElement. Esempio:

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché