使用精確的HTML搜索或將HTMLElement轉換為HTMLNode獲取HtmlAgilityPack節點

browser c# html-agility-pack

我使用默認的.net WebBrowser創建了一個HTMLElement選擇器(DOM)。用戶可以通過單擊選擇(選擇)HTMLElement。

我想獲得與HTMLElement對應的HtmlAgilityPack.HTMLNode。

最簡單的方法(在我看來)是使用doc.DocumentNode.SelectSingleNode(EXACTHTMLTEXT),但它並沒有真正起作用(因為該函數只接受xpath代碼)。

我怎樣才能做到這一點?

用戶選擇的示例HTMLElement如下所示(The OuterHtml Code):

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

當然,可以選擇任何元素,這就是我需要一種獲取HTMLNode的方法的原因。

一般承認的答案

相同的概念,但有點簡單,因為您不必知道元素類型:

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

熱門答案

我想出了一個解決方案。不知道它是否是最好的(如果有人知道更好的方法讓我知道,我會很感激)。

這是獲取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 <");
            }
        }

這個想法是你傳遞了HtmlElement的OuterHtml。例:

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因