使用HTMLAgilityPack获取select元素的所有值

本文关键字:元素 HTMLAgilityPack 获取 select 使用 | 更新日期: 2023-09-27 18:27:15

以下是我迄今为止所拥有的:

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);
    }
}

现在我有一个所有";选项";用于选择元素。我需要访问哪些属性才能获得密钥和文本?

因此,例如,如果一个选项的html是:

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

我想获得输出:

1 - Funky Town

感谢

编辑:我刚刚注意到一件事。当我得到";选择";元素,它返回类型为"的元素;选项";以及类型为"#文本";。

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

我觉得HTMLAgilityPack是一个html解析器?为什么它会给我这样令人困惑的价值观?

使用HTMLAgilityPack获取select元素的所有值

这是由于html解析器的默认配置;它已将<option>配置为HtmlElementFlag.Empty(注释为"它们有时包含,有时不包含…")。<form>标记具有相同的设置(CanOverlap+Empty),这导致它们在dom中显示为空节点,没有任何子节点。

在解析文档之前,您需要删除该标志。

HtmlNode.ElementsFlags.Remove("option");

请注意,ElementsFlags属性是静态的,任何更改都将影响所有进一步的解析。

edit:您可能应该通过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;

}


您可以在属性上添加一些健全性检查,以确保它存在。