繁体   English   中英

HtmlAgilityPack:如何检查元素是否可见?

[英]HtmlAgilityPack: How to check if an element is visible?

我正在执行一些HTML解析,并且正在使用HtmlAgilityPack,并且尝试检查是否在浏览器中呈现了html时是否可以看到node元素。

通过可见,我可能对检查displayvisibility样式值感到满意。 (除非还有其他我应该担心的事情?)。

那么,我该怎么做呢? 是否有轻松构建的方法? 我可以使用一些XPath魔术吗? (我目前对XPath并不了解太多)。

我曾考虑过手动解析样式值,但宁愿将其保存为万不得已。 还是这是我唯一的选择?

仅供参考,我正在使用的对象是这样的:

HtmlAgilityPack.HtmlNode node = GetNode();

好的,至少在我的需要下,我设法做到了。 但是,请注意,正如其他评论所提到的,这不允许您检查元素是否对最终用户可见(在屏幕上)。

我采用的简单方法检查了一些基本规则:如果元素的样式属性包含display:none或visible 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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM