HtmlAgilityPack: как проверить, является ли элемент видимым?

c# html-agility-pack

Вопрос

Я занимаюсь обработкой HTML, и я использую HtmlAgilityPack, и я пытаюсь проверить, будет ли элемент узла видимым, если html был отображен в браузере.

Видимо, я, вероятно, доволен проверкой значений стиля display и visibility . (если есть что-то дополнительное, о чем я должен беспокоиться?).

Итак, как я могу это сделать? Есть ли сборка в простой форме? Могу ли я использовать магию 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 .



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow