Supposons que j'ai le code HTML suivant
<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>
Je souhaite extraire chaque partie séparément à l'aide de HTMLAgilityPack en C #
Je peux obtenir le mot et la classe de mots assez facilement
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;
Mais comment puis-je obtenir la prononciation ou la définition réelle? Ceux-ci se situent entre les nœuds, et si j'utilise defintion.InnerText
je reçois le tout en une chaîne. Peut-on faire cela dans XPath
peut-être?
Comment sélectionner du texte entre des nœuds dans HtmlAgilityPack?
Peut-on faire cela dans XPath peut-être?
Oui - et assez facile.
Le concept clé que vous devez comprendre est la manière dont les nœuds de texte et d'élément enfant sont organisés en XML / HTML - et donc XPath.
Si le contenu textuel d'un élément est ponctué par des éléments enfants, ils se retrouvent dans des nœuds de texte distincts. Vous pouvez accéder à des nœuds de texte individuels par leur position.
Le simple fait d'utiliser text()
sur n'importe quel élément permet d'extraire tous les nœuds de texte enfants. En appliquant //p/text()
à l’extrait de code que vous avez montré les rendements (résultats individuels séparés par -------
):
[EMPTY TEXT NODE, EXCEPT WHITESPACE]
-----------------------
\ih-MOL-yuh-muhnt\,
-----------------------
:
The wages or perquisites arising from office, employment, or labor
Le premier nœud de texte de cet élément p
ne contient que des espaces, ce n'est donc probablement pas ce que vous recherchez. //p/text()[2]
récupère
\ih-MOL-yuh-muhnt\,
et //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());
}
La sortie de ceci sera:
Si vous voulez 2. \ih-MOL-yuh-muhnt\,
résultat. Tu en as besoin.
HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();