정확한 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는 합법적입니까? 예, 이유를 알아보십시오.