HTMLAgilityPackを使用してselect要素のすべての値を取得する

c# html-agility-pack winforms

質問

これまで私がこれまで持っていたことは次のとおりです。

            HtmlAgilityPack.HtmlDocument ht = new HtmlAgilityPack.HtmlDocument();


       TextReader reader = File.OpenText(@"C:\Users\TheGateKeeper\Desktop\New folder\html.txt");
        ht.Load(reader);

        reader.Close();

        HtmlNode select= ht.GetElementbyId("cats[]");


        List<HtmlNode> options = new List<HtmlNode>();

        foreach (HtmlNode option in select.ChildNodes)
        {
            if (option.Name == "option")
            {
                options.Add(option);
            }
        }

今私はselect要素のすべての "options"のリストを持っています。キーとテキストを取得するには、どのプロパティにアクセスする必要がありますか?

したがって、たとえば、あるオプションのhtmlが次のようになるとします。

<option class="level-1" value="1">Funky Town</option>

私は出力として取得したい:

1 - Funky Town

ありがとう

編集:私はちょうど何かに気づいた。私は "Select"要素の子要素を取得すると、 "option"型の要素と "#text"型の要素を返しました。

Hmmm .. #textには私が望む文字列がありますが、selectには値があります。

HTMLAgilityPackはhtmlパーサでしたか?なぜそれは私にこのような混乱する価値を与えましたか?

受け入れられた回答

これは、htmlパーサーのデフォルトの設定によるものです。 <option>はHtmlElementFlag.Emptyとして設定されています(コメントに '時には含まれていますが、時にはそうではありません...')。 <form>タグは同じセットアップ(CanOverlap + Empty)を持っているため、子ノードなしでDOMに空のノードとして表示されます。

ドキュメントを解析する前に、そのフラグを削除する必要があります。

HtmlNode.ElementsFlags.Remove("option");

ElementsFlagsプロパティは静的であり、すべての変更が以降のすべての解析に影響することに注意してください。


人気のある回答

編集:おそらくxpath経由でoptionノードを直接選択する必要がありoption 。私はこれがうまくいくと思う:

var options = select.SelectNodes("option");

それはテキストノードなしであなたのオプションを得るでしょう。オプションはあなたがどこかで望むその文字列を含むべきです。あなたのhtmlサンプルを待っています。

foreach (var option in options)
{
    int value = int.Parse(option.Attributes["value"].Value);
    string text = option.InnerText;

}

Â
属性にいくつかのサニティチェックを追加して、属性が存在することを確認することができます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow