Ottenere il testo tra due nodi html usando HtmlAgilityPack

c# html-agility-pack linq nodes xpath

Domanda

Supponiamo che io abbia il seguente codice 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>

Voglio estrarre ogni parte separatamente usando HTMLAgilityPack in C #

Posso ottenere la parola e la classe di parola abbastanza facilmente

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;

Ma come ottengo la pronuncia o la definizione attuale? Questi cadono tra i nodi, e se uso defintion.InnerText ottengo tutto il lotto in una stringa. C'è un modo per farlo in XPath forse?

Come seleziono il testo tra i nodi in HtmlAgilityPack?

Risposta accettata

C'è un modo per farlo in XPath forse?

Sì - e abbastanza facile.

Il concetto chiave che devi capire è come i nodi di elementi di testo e figlio sono organizzati in XML / HTML - e quindi XPath.

Se il contenuto testuale di un elemento è punteggiato da elementi figli, finiscono in nodi di testo separati. È possibile accedere ai singoli nodi di testo in base alla loro posizione.

Semplicemente usando text() su qualsiasi elemento recupera tutti i nodi di testo figlio. Applicando //p/text() allo snippet che hai mostrato produce (singoli risultati separati da ------- ):

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

Il primo nodo di testo di questo elemento p contiene solo spazi bianchi, quindi probabilmente non è quello che stai cercando. //p/text()[2] recupera

  \ih-MOL-yuh-muhnt\,

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

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

Risposta popolare

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

L'output di questo sarà:

  1. emolumento
  2. \ IH-MOL-Yuh-muhnt \,
  3. sostantivo
  4. :
  5. Gli stipendi o i compensi derivanti dall'ufficio, dall'impiego o dal lavoro

Se vuoi 2. \ih-MOL-yuh-muhnt\, risultato. Hai bisogno di questo.

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché