2015-01-30 2 views
2

Предположим, что у меня есть следующий HTMLПолучение текста из между двумя HTML узлами с помощью HtmlAgilityPack

<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?

ответ

0

Есть ли способ сделать это в 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] извлекает

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

: 
The wages or perquisites arising from office, employment, or labor 
0
 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();