Obtenir du texte entre deux nœuds html à l'aide de HtmlAgilityPack

c# html-agility-pack linq nodes xpath

Question

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

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

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?

Réponse acceptée

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

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

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

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

Réponse populaire

        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:

  1. émoluments
  2. \ ih-MOL-yuh-muhnt \,
  3. nom
  4. :
  5. Les salaires ou avantages découlant du bureau, de l'emploi ou du travail

Si vous voulez 2. \ih-MOL-yuh-muhnt\, résultat. Tu en as besoin.

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi