Html Agility Pack, recherche sur le site la chaîne de mots spécifiée

c# html-agility-pack

Question

J'utilise le pack d'agilité HTML pour cette tâche. En gros, j'ai une URL et mon programme doit lire le contenu de la page html dessus, et s'il trouve une ligne de texte (c'est-à-dire: "John avait trois pommes "), le texte d’une étiquette doit être remplacé par" trouvé ".

J'ai essayé de le faire avec des contenus, mais j'imagine qu'il ne vérifie qu'un mot.

var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");

if (nodeBFT != null && nodeBFT.Count != 0)
    myLabel.Text = "Found it";

EDIT: Reste de mon code, maintenant avec la tentative de ako:

var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");

if (nodeBFT != null && nodeBFT.Count != 0)
    myLabel.Text = "Found it";

Réponse acceptée

Une option possible est d'utiliser . au lieu de text() . Passer la fonction text() à contains() comme vous l'avez fait, comme vous le supposiez, n'est effectif que lorsque le texte recherché est le premier enfant direct de l'élément en cours:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

De l'autre côté, contains(., '...') évalue la totalité du contenu textuel de l'élément en cours, concaténé. Ainsi, juste un avertissement, le XPath ci-dessus considérera également l'élément suivant par exemple, comme une correspondance:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

Si vous avez besoin que XPath prenne en compte uniquement les cas où le mot clé entier est contenu dans un seul nœud de texte et considère donc le cas ci-dessus comme une non-correspondance, vous pouvez essayer de cette façon:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

Si rien de ce qui précède ne vous convient, envoyez un extrait de code HTML minimal contenant le mot clé, mais ne contenant aucune correspondance, afin que nous puissions examiner plus avant les causes possibles de ce problème et la façon de le résoudre.


Réponse populaire

utilisez ceci:

if (doc.DocumentNode.InnerHtml.ToString().Contains("John had three apples"))
    myLabel.Text="Found it";



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