Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用精确的HTML搜索或将HTMLElement转换为HTMLNode获取HtmlAlityPack节点_C#_Browser_Html Agility Pack - Fatal编程技术网

C# 使用精确的HTML搜索或将HTMLElement转换为HTMLNode获取HtmlAlityPack节点

C# 使用精确的HTML搜索或将HTMLElement转换为HTMLNode获取HtmlAlityPack节点,c#,browser,html-agility-pack,C#,Browser,Html Agility Pack,我使用默认的.NETWebBrowser创建了一个HtmleElement选择器(DOM)。 用户可以通过单击HTMLElement来选择一个HTMLElement 我想获取与HTMLElement对应的HtmlAgilityPack.HTMLNode 在我看来,最简单的方法是使用doc.DocumentNode.SelectSingleNode(EXACTHTMLTEXT),但它实际上不起作用(因为该函数只接受xpath代码) 我该怎么做 用户选择的示例HTMLElement如下所示(Oute

我使用默认的.NETWebBrowser创建了一个HtmleElement选择器(DOM)。 用户可以通过单击HTMLElement来选择一个HTMLElement

我想获取与HTMLElement对应的HtmlAgilityPack.HTMLNode

在我看来,最简单的方法是使用doc.DocumentNode.SelectSingleNode(EXACTHTMLTEXT),但它实际上不起作用(因为该函数只接受xpath代码)

我该怎么做

用户选择的示例HTMLElement如下所示(OuterHtml代码):



当然,可以选择任何元素,这就是为什么我需要一种获取HTMLNode的方法。

我想出了一个解决方案。不知道这是否是最好的(如果有人知道更好的方法来实现这一点,请让我知道,我将不胜感激)

下面是将获取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 <");
            }
        }

相同的概念,但更简单一点,因为您不必知道元素类型:

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