2

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

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

最简单的方法(在我看来)是使用 doc.DocumentNode.SelectSingleNode(EXACTHTMLTEXT) 但它并没有真正起作用(因为该函数只接受 xpath 代码)。

我怎样才能做到这一点?

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

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

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

4

2 回答 2

1

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

HtmlNode n = doc.DocumentNode.Descendants().Where(n => n.OuterHtml.Equals(text, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
于 2012-06-07T18:53:38.297 回答
1

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

这是将获取 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。例子:

HtmlElement el=....
HtmlNode N = GetNode(el.OuterHtml);
于 2012-06-06T01:17:37.463 回答