使用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元素的所有“選項”列表。獲取密鑰和文本需要訪問哪些屬性?

因此,例如,如果一個選項的html將是:

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

我想得到輸出:

1 - Funky Town

謝謝

編輯:我剛注意到了一些事情。當我獲得“Select”元素的子元素時,它返回“option”類型的元素和“#text”類型的元素。

嗯.. #text有我想要的字符串,但select有值。

我認為HTMLAgilityPack是一個HTML解析器?為什麼它給我這樣令人困惑的價值?

一般承認的答案

這是由於html解析器的默認配置;它已將<option>配置為HtmlElementFlag.Empty(註釋'它們有時包含,有時它們不包含......')。 <form>標籤具有相同的設置(CanOverlap + Empty),這使得它們在dom中顯示為空節點,沒有任何子節點。

您需要在解析文檔之前刪除該標誌。

HtmlNode.ElementsFlags.Remove("option");

請注意,ElementsFlags屬性是靜態的,任何更改都將影響所有進一步的解析。


熱門答案

編輯:你應該直接通過xpath選擇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