使用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
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因