Выберите все элементы DOM с помощью HTMLAgilityPack

.net c# dom html html-agility-pack

Вопрос

Я смотрел на подобные вопросы и искал он-лайн, но я не могу найти решение. То, что я пытаюсь сделать, это выбрать все элементы DOM по порядку (и т. Д.), А затем поместить их в arraylist или что-то еще.

в настоящее время у меня есть

public void Parse()
    {
        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

        // There are various options, set as needed
        //htmlDoc.OptionFixNestedTags = true;

        // filePath is a path to a file containing the html
        htmlDoc.Load("Test.html");

        // Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)

        // ParseErrors is an ArrayList containing any errors from the Load statement
        if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
        {
            Console.WriteLine("There was an error parsing the HTML file");
        }
        else
        {
            if (htmlDoc.DocumentNode != null)
            {
                htmlDoc.DocumentNode.Descendants();

                Console.WriteLine("document node not null");
                //HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

                foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
                {
                    Console.WriteLine(node.Name);
                }
            }
        }
    }

Код выводит имя узла (html, заголовок, изображение и т. Д.), Но выводит закрывающие теги как «#text». Я предполагаю, что это происходит потому, что теги начинаются с «/». Как я могу получить правильное считывание всех элементов DOM?

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

«#text» - это имя текстовых узлов, а закрывающие теги не представлены как нечто уникальное в DOM.

<div><span>foo</span> bar</div>

Дает вам дерево, как

div
   span
      #text:foo
   #text:bar

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

Я подозреваю, что элементы #text которые вы видели, это разрывы строк, а не закрытие тега. Например, этот html-ввод:

<div>
    <a href="http://example.org"></a>
</div>

используя ваш код будет выводить:

div
#text   <- line break between <div> and <a>
a
#text  <- line break between </a> and </div>

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

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*"))
{
    Console.WriteLine(node.Name);
}

Это означает, что XPath означает, что все потоки текущего элемента имеют любое имя ( * ).



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему