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

0

Я смотрел на подобные вопросы и искал он-лайн, но я не могу найти решение. То, что я пытаюсь сделать, это выбрать все элементы 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?

  • 1
    Пожалуйста, предоставьте пример ввода и очистите ваш код (удалите комментарии / пустые проверки), чтобы просто показать проблему. Обратите внимание, что "#text" - это имя текстовых узлов ... Закрывающие теги не имеют собственных узлов.
  • 0
    Это довольно хорошо ответил на мой вопрос. Если я не могу получить закрывающие теги, мне нужно будет найти новое решение. Благодарю.
Теги:
dom
html-agility-pack

2 ответа

0
Лучший ответ

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

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

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

div
   span
      #text:foo
   #text:bar
1

Я подозреваю, что элементы #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 означает, что все потоки текущего элемента имеют любое имя (*).

  • 0
    +1 - хорошая точка на разрывах строк, показанная как текст, и способ пропустить текстовые узлы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню