HtmlAgilityPack : 요소가 표시되는지 확인하는 방법

c# html-agility-pack

문제

나는 HTML 구문 분석을하고 있는데 HtmlAgilityPack을 사용하고 있는데 html이 브라우저에서 렌더링되면 노드 요소가 보이는지 확인하려고합니다.

시각적으로 볼 때 displayvisibility 스타일 값을 확인하는 것이 좋습니다. (내가 걱정해야 할 부분이없는 한?).

그래서, 어떻게해야합니까? 쉬운 방법으로 빌드가 있습니까? 일부 XPath 매직을 사용할 수 있습니까? (나는 지금 XPath에 대해 너무 많이 알지 못한다.)

필자는 스타일 값을 수동으로 파싱하는 방법에 대해 생각해 보았지만 이것을 최후의 수단으로 저장하려고합니다. 아니면이게 유일한 방법인가요?

참고로, 내가 작업하고있는 객체는 다음과 같습니다.

HtmlAgilityPack.HtmlNode node = GetNode();

수락 된 답변

좋아요. 그래서 저는 적어도 저의 필요에 따라이 일을 해 냈습니다. 그러나 다른 주석에서 언급했듯이 최종 사용자를 위해 요소가 화면에 표시되는지 확인하는 것은 허용되지 않습니다.

내가 취한 접근법은 몇 가지 기본 규칙을 검사합니다. 요소의 스타일 속성에 display:none 또는 visibility:hidden 있거나 요소 조인 요소가 동일한 스타일 규칙을 갖는 경우 요소는 "표시되지 않습니다".

이를 염두에두고, 나를 위해 일하는 코드는 다음과 같습니다.

private static bool IsNodeVisible(HtmlAgilityPack.HtmlNode node)
{
    var attribute = node.Attributes["style"];

    bool thisVisible = false;

    if (attribute == null || CheckStyleVisibility(attribute.Value))
        thisVisible = true;

    if (thisVisible && node.ParentNode != null)
        return IsNodeVisible(node.ParentNode);

    return thisVisible;
}

private static bool CheckStyleVisibility(string style)
{
    if (string.IsNullOrWhiteSpace(style))
        return true;

    var keys = ParseHtmlStyleString(style);

    if (keys.Keys.Contains("display"))
    {
        string display = keys["display"];
        if (display != null && display == "none")
            return false;
    }

    if (keys.Keys.Contains("visibility"))
    {
        string visibility = keys["visibility"];
        if (visibility != null && visibility == "hidden")
            return false;
    }

    return true;
}

public static Dictionary<string, string> ParseHtmlStyleString(string style)
{
    Dictionary<string, string> result = new Dictionary<string, string>();

    style = style.Replace(" ", "").ToLowerInvariant();

    string[] settings = style.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

    foreach (string s in settings)
    {
        if (!s.Contains(':'))
            continue;
        string[] data = s.Split(':');
        result.Add(data[0], data[1]);
    }

    return result;
}

이 엔트리 포인트는 IsNodeVisible 이며 전달 된 HtmlNode 의 가시성을 검사합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.