使用 HTMLAgilityPack 获取选择元素的所有值

问题描述 投票:0回答:2

这是我到目前为止所拥有的:

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

谢谢

编辑:我刚刚注意到一些事情。当我获取“Select”元素的子元素时,它返回“option”类型的元素和“#text”类型的元素。

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

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

c# winforms html-agility-pack
2个回答
2
投票

这是由于 html 解析器的默认配置造成的;它将

<option>
配置为 HtmlElementFlag.Empty (带有注释“它们有时包含,有时不包含...”)。
<form>
标签具有相同的设置(CanOverlap + Empty),这导致它们在 dom 中显示为空节点,没有任何子节点。

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

HtmlNode.ElementsFlags.Remove("option");

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


0
投票

编辑:您可能应该直接通过 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;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.