Разбор XHTML с помощью HTMLAgilityPack - PullRequest
2 голосов
/ 21 января 2011

У меня есть список следующих элементов внутри элемента, который я нашел с помощью HTMLAgilityPack.

<option value="67"><span style="color: #cc0000;">Horde</span> Leveling / Dailies & Event Guide ($50.00)</option>

Что мне нужно сделать, так это разобрать весь текст из тега, без всякого там огромного большого количества. Я попробовал (казалось бы!) Все, но это всегда выглядит так:

Орда
Выравнивание / ежедневные газеты и гиды ($ 50,00)

и иногда, как:

Орда
Прокачка
/ Ежедневники и путеводитель ($ 50,00)

и еще пара таких вариаций. Я даже дошел до того, что распечатывал каждый символ в строке как байт, и я не нашел никаких разрывов строк или каналов, только то, что я ожидал, обычные буквы и пробелы. Вот полный источник HTML для справки, скопированный прямо со страницы.

<option value="13"><span style="color: #0000ff;">Alliance</span> Leveling Guide ($30.00)</option>


<option value="12"><span style="color: #cc0000;">Horde</span> Leveling Guide ($30.00)</option>

<option value="46"><span style="color: #cc0000;">Horde</span> Dailies & Events Guide ($25.00)</option>

<option value="67"><span style="color: #cc0000;">Horde</span> Leveling / Dailies & Event Guide ($50.00)</option>


<option value="11"><span style="color: #0000ff;">Alliance</span> &amp; <span style="color: #cc0000;">Horde</span> Leveling Guide ($50.00)</option>

<option value="97"><span style="color: #0000ff;">Alliance</span> Achievements & Professions Guide ($20.00)</option>

<option value="98"><span style="color: #cc0000;">Horde</span> Achievements & Professions Guide ($20.00)</option>


<option value="99"><span style="color: #0000ff;">Alliance</span> &amp; <span style="color: #cc0000;">Horde</span> Achievements & Professions Guide ($30.00)</option>

1 Ответ

5 голосов
/ 21 января 2011

По умолчанию тег <OPTION> обрабатывается Html Agility Pack как «пустой», что означает, что ему не нужно закрывать </OPTION>, поэтому в этом случае нелегко поймать с XPATH.Вы можете изменить это, используя коллекцию HtmlNode.ElementFlags.

Вот код, который должен делать то, что вы хотите:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Remove("option");
doc.LoadHtml(yourHtml);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//option"))
{
    Console.WriteLine(node.InnerText);
}
...