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?
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
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à:
Se vuoi 2. \ih-MOL-yuh-muhnt\,
risultato. Hai bisogno di questo.
HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();