HtmlAgilityPack: Comment vérifier si un élément est visible?

c# html-agility-pack

Question

Je suis en train d'analyser le code HTML, d'utiliser HtmlAgilityPack et d'essayer de vérifier si un élément de noeud est visible si le code HTML a été affiché dans un navigateur.

Visiblement, je me contente probablement de vérifier les valeurs de style d’ display et de visibility . (à moins qu'il y ait quelque chose de plus qui devrait m'inquiéter?).

Alors, comment puis-je faire cela? Yat-il une construction de manière simple? Puis-je utiliser de la magie XPath? (Je n'ai pas trop de connaissances sur XPath pour le moment).

J'ai envisagé d'analyser manuellement la valeur du style, mais préférerais l'enregistrer en dernier recours. Ou est-ce ma seule option?

Juste pour référence, l'objet avec lequel je travaille ressemble à ceci:

HtmlAgilityPack.HtmlNode node = GetNode();

Réponse acceptée

OK, j'ai donc réussi à le faire, du moins pour mes besoins. Soyez averti cependant, comme d'autres commentaires l'ont mentionné, cela ne vous permet pas de vérifier si un élément sera visible (à l'écran) pour l'utilisateur final.

L’approche que j’ai adoptée vérifie quelques règles de base: Un élément est "non visible" si l’attribut style de l’élément contient display:none ou visibility:hidden , OU un élément ancêtre a les mêmes règles de style.

Dans cet esprit, voici mon code qui fait le travail pour moi:

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;
}

Le point d’entrée pour cela est IsNodeVisible et vérifiera la visibilité du HtmlNode transmis.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi