Obtener texto entre dos nodos html usando HtmlAgilityPack

c# html-agility-pack linq nodes xpath

Pregunta

Supongamos que tengo el siguiente 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>

Quiero extraer cada parte por separado utilizando HTMLAgilityPack en C #

Puedo obtener la palabra y la clase de palabras fácilmente

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;

Pero, ¿cómo obtengo la pronunciación o definición real? Estos caen entre nodos, y si uso defintion.InnerText obtengo todo el lote en una cadena. ¿Hay alguna manera de hacer esto en XPath quizás?

¿Cómo selecciono texto entre nodos en HtmlAgilityPack?

Respuesta aceptada

¿Hay alguna manera de hacer esto en XPath quizás?

Sí, y bastante fácil.

El concepto clave que debe comprender es cómo se organizan los nodos de elementos secundarios y de texto en XML / HTML y, por lo tanto, XPath.

Si el contenido textual de un elemento está puntuado por elementos secundarios, terminan en nodos de texto separados. Puede acceder a nodos de texto individuales por su posición.

Simplemente utilizando text() en cualquier elemento recupera todos los nodos de texto secundarios. Aplicando //p/text() al fragmento que ha mostrado los rendimientos (resultados individuales separados por ------- ):

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

El primer nodo de texto de este elemento p solo contiene espacios en blanco, por lo que probablemente no sea lo que está buscando. //p/text()[2] recupera

  \ih-MOL-yuh-muhnt\,

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

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

Respuesta popular

        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());
        }

El resultado de esto será:

  1. emolumento
  2. \ ih-MOL-yuh-muhnt \,
  3. sustantivo
  4. :
  5. Los salarios o beneficios que se derivan del cargo, empleo o trabajo

Si quieres 2. \ih-MOL-yuh-muhnt\, result. Necesitas esto.

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué