Использование 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

благодаря

Редактировать: Я что-то заметил. Когда я получил дочерние элементы элементов «Выбрать», он возвращал элементы типа «option» и элементы типа «#text».

Hmmm .. #text имеет строку, которую я хочу, но выберите значение.

Я жестко HTMLAgilityPack был html-парсером? Почему это привело меня к путанице таких ценностей?

Принятый ответ

Это связано с конфигурацией по умолчанию для синтаксического анализатора html; он настроил <option> как HtmlElementFlag.Empty (с комментарием, который они иногда содержат, а иногда и не ...). Тег <form> имеет ту же настройку (CanOverlap + Empty), которая заставляет их отображаться как пустые узлы в dom, без каких-либо дочерних узлов.

Перед анализом документа необходимо удалить этот флаг.

HtmlNode.ElementsFlags.Remove("option");

Обратите внимание, что свойство ElementsFlags является статическим, и любые изменения повлияют на все последующие синтаксические разборки.


Популярные ответы

edit: вы должны, вероятно, выбрать узлы option непосредственно через xpath. Я думаю, что это должно сработать для этого:

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
Является ли этот КБ законным? Да, узнайте, почему