3

HTML解析を行っており、HtmlAgilityPackを使用しており、HTMLがブラウザーでレンダリングされた場合にノード要素が表示されるかどうかを確認しようとしています。

目に見えることで、私はおそらくdisplayvisibilityスタイルの値をチェックすることに満足しています。(私が心配すべき追加の何かがない限り?)

だから、どうすればこれを行うことができますか?簡単な方法でビルドはありますか?XPathマジックを使用できますか?(現時点では、XPathについてあまり知識がありません)。

スタイル値を手動で解析することを考えましたが、これを最後の手段として保存したいと思います。それともこれが私の唯一の選択肢ですか?

参考までに、私が使用しているオブジェクトは次のようなものです。

HtmlAgilityPack.HtmlNode node = GetNode();
4

1 に答える 1

5

OK、それで、少なくとも私のニーズのために、私はこれをなんとかすることができました。ただし、他のコメントで述べられているように、これでは、要素がエンドユーザーに(画面上に)表示されるかどうかを確認することはできません。

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

于 2013-02-21T14:55:28.567 に答える