【问题标题】:Using HTMLAgilityPack to get all the values of a select element使用 HTMLAgilityPack 获取选择元素的所有值
【发布时间】:2012-03-08 19:29:02
【问题描述】:

这是我目前所拥有的:

            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 解析器?为什么它给了我这样令人困惑的值?

【问题讨论】:

  • 你能从源文件中发布一些 html 吗?

标签: c# winforms html-agility-pack


【解决方案1】:

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

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

HtmlNode.ElementsFlags.Remove("option");

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

【讨论】:

    【解决方案2】:

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

    }

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

    【讨论】:

    • 这也是我坚持的,但每个项目的 innerText 都是“”。
    • 嗯,我正在使用 InnerText,它对我有用。也许看看option.FirstChild,看看它是否存在/包含你的价值。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2023-03-12
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多