Получение текста между двумя узлами html с использованием HtmlAgilityPack

c# html-agility-pack linq nodes xpath

Вопрос

Предположим, у меня есть следующий HTML-код

<p id="definition">
    <span class="hw">emolument</span> \ih-MOL-yuh-muhnt\, <i>noun</i>:
    The wages or perquisites arising from office, employment, or labor
</p>

Я хочу извлечь каждую часть отдельно, используя HTMLAgilityPack в C #

Я могу легко получить слово и слово класс

var definition = doc.DocumentNode.Descendants()
    .Where(x => x.Name == "p" && x.Attributes["id"] == "definition")
    .FirstOrDefault();

string word = definition.Descendants()
    .Where(x => x.Name == "span")
    .FirstOrDefault().InnerText;

string word_class = definition.Descendants()
    .Where(x => x.Name == "i")
    .FirstOrDefault().InnerText;

Но как мне получить произношение или фактическое определение? Они падают между узлами, и если я использую defintion.InnerText я получаю всю партию в одной строке. Есть ли способ сделать это в XPath возможно?

Как выбрать текст между узлами в HtmlAgilityPack?

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

Есть ли способ сделать это в XPath, возможно?

Да - и довольно легкий.

Ключевой концепцией, которую вам нужно понять, является то, как узлы элементов текста и дочернего элемента организованы в XML / HTML - и, следовательно, XPath.

Если текстовое содержимое элемента прерывается дочерними элементами, они попадают в отдельные текстовые узлы. Вы можете получить доступ к отдельным текстовым узлам по их позиции.

Просто используя text() для любого элемента извлекает все дочерние текстовые узлы. Применяя //p/text() к фрагменту, который вы показали, дает результат (отдельные результаты разделяются на ------- ):

[EMPTY TEXT NODE, EXCEPT WHITESPACE]
-----------------------
\ih-MOL-yuh-muhnt\,
-----------------------
:
The wages or perquisites arising from office, employment, or labor

Первый текстовый узел этого элемента p содержит только пробелы, поэтому, вероятно, это не то, что вам нужно. //p/text()[2] извлекает

  \ih-MOL-yuh-muhnt\,

и //p/text()[3] :

:
The wages or perquisites arising from office, employment, or labor

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

        HtmlNode text = doc.DocumentNode.Descendants().Where(x => x.Name == "p" && x.Id == "definition").FirstOrDefault();

        foreach (HtmlNode node in text.SelectNodes(".//text()"))
        {
            Console.WriteLine(node.InnerText.Trim());
        }

Результатом этого будет:

  1. жалованье
  2. \ IH-МОЛ-йух-muhnt \,
  3. имя существительное
  4. :
  5. Заработная плата или взятки, связанные с работой, занятостью или трудом

Если вы хотите 2. \ih-MOL-yuh-muhnt\, результат. Ты нуждаешься в этом.

HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();


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