Comment utiliser la méthode XPath – Evaluate()
XPath
XPath (XML Path Language) fournit un moyen flexible de pointer vers différentes parties d’un document basé sur XML en utilisant une syntaxe non-XML. Le nom de XPath dérive de l’expression path, qui fournit un moyen d’adressage hiérarchique des nœuds dans l’arborescence d’un document. XPath est un langage d’interrogation qui offre de nombreuses possibilités. XPath permet de traiter des valeurs conformes au modèle de données DOM ; il est basé sur une représentation DOM du document HTML et sélectionne les nœuds selon différents critères. Les expressions XPath peuvent également être utilisées en C et C++, JavaScript, XML Schema, PHP, Python et bien d’autres langages.
XPath est principalement utilisé pour naviguer dans le DOM d’un document de langage XML à l’aide d’expressions XPath. Vous pouvez utiliser XPath en HTML et SVG au lieu de vous fier aux méthodes GetElement() ou QuerySelectorAll() et à d’autres fonctions DOM.
Cet article explique comment utiliser la méthode Evaluate() pour naviguer dans le document HTML et sélectionner des nœuds à l’aide d’une requête XPath. Vous apprendrez comment sélectionner toutes les photos d’un document HTML à l’aide d’expressions XPath.
Vous pouvez télécharger les fichiers de données et les exemples C# complets qui démontrent l’utilisation de la méthode Evaluate() pour les requêtes XPath à partir de GitHub.
Méthode Evaluate()
Les requêtes XPath sont principalement effectuées à l’aide de la méthode
Evaluate() de la classe
Document. La méthode Evaluate(expression
, contextNode
, resolver
, type
, result
) accepte une expression XPath et d’autres paramètres donnés et renvoie un résultat du type spécifié. Examinons les paramètres de la méthode :
expression
est une représentation sous forme de chaîne de caractères de l’XPath à évaluer.contextNode
spécifie le nœud de contexte pour l’évaluation de l’expression XPath. Il est courant de passer le document comme nœud de contexte.resolver
permet de traduire tous les préfixes, y compris le préfixe d’espace de noms xml, dans l’expression XPath en URI d’espace de noms appropriés.type
correspond au type de résultat XPathResult à retourner. Si un type spécifique est spécifié, le résultat sera renvoyé sous la forme du type correspondant.result
spécifie un objet résultat spécifique qui peut être réutilisé et renvoyé par cette méthode. null est le plus courant et créera un nouveau XPathResult.
Requête XPath – Obtenir des images à partir d’une page web
Il arrive souvent que vous souhaitiez enregistrer un grand nombre d’images provenant de différents services, comme les photos d’un album particulier. Il est possible de le faire à la main, mais cela prendrait un temps considérable. Vous pouvez donc utiliser la bibliothèque Aspose.HTML pour automatiser ce processus.
Dans cet exemple, vous apprendrez à trouver des liens vers toutes les images souhaitées sur une page web en utilisant la méthode Evaluate() et l’expression XPath. XPath est un langage de requête puissant qui offre une grande liberté de personnalisation des requêtes. Examinons le document HTML xpath-image.htm. Il se compose d’un en-tête et d’un pied de page contenant des images publicitaires, ainsi que de l’élément principal qui contient des rangées de photos entrecoupées de bannières publicitaires.
Obtenir des liens vers toutes les images du document
Commençons par une requête XPath simple pour toutes les images du document. La requête suivante utilise l’expression XPath //img
. Elle sélectionne tous les éléments img
, quel que soit leur emplacement dans le document :
XPath Expression
1//img
C# code
1var result = doc.Evaluate("//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//img", document, null, XPathResult.ANY_TYPE, null);
Cette requête XPath renverra tous les liens vers les images (photos, bannières) de l’en-tête et du pied de page, ainsi que ceux qui se trouvent entre les lignes de photos et parmi elles.
Suppression des bannières dans l’en-tête et le pied de page
Tout d’abord, débarrassons-nous des bannières dans l’en-tête et le pied de page. Il y a de nombreuses façons de le faire, mais dans cet exemple, nous allons définir le filtrage par un parent. La requête XPath //main//img
renvoie tous les éléments //img
imbriqués dans tous les éléments //main
. Ce résultat est déjà mieux adapté à la demande d’extraction de photos du document, mais il contient encore des bannières supplémentaires.
XPath Expression
1//main//img
C# code
1var result = doc.Evaluate("//main//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main//img", document, null, XPathResult.ANY_TYPE, null);
Suppression de certaines bannières dans le conteneur “principal”
Dans l’étape suivante, débarrassons-nous des bannières dans les éléments enfants /div
pairs du conteneur main
. Cette expression XPath vous permet de sélectionner tous les éléments enfants /div
dont le numéro de position donne le reste lorsqu’il est divisé par 2, c’est-à-dire impair :
XPath Expression
1//main/div[position() mod 2 = 1]//img
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img", document, null, XPathResult.ANY_TYPE, null);
Nous avons donc une liste contenant des liens vers des photos et des bannières publicitaires situées dans tous les éléments div
qui sont des enfants du conteneur main
.
Obtenir uniquement les liens vers les photos du document HTML
Pour se débarrasser des bannières publicitaires situées parmi les photos, l’expression XPath doit inclure le nom de la classe d’image car toutes les photos des lignes ont la classe correspondante photo
:
XPath Expression
1//main/div[position() mod 2 = 1]//img[@class = 'photo']
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", document, null, XPathResult.ANY_TYPE, null);
En conséquence, nous avons obtenu une liste contenant uniquement des liens vers des photos. Il ne reste donc plus qu’à les télécharger.
Exemple C# – Obtenir uniquement les liens vers les photos du document HTML
Examinons l’exemple C# de l’utilisation de la méthode Evaluate() pour sélectionner toutes les photos d’un document HTML à l’aide d’expressions XPath. Vous devez suivre quelques étapes :
- Charger un fichier HTML existant ( xpath-image.htm).
- Utilisez la méthode Evaluate() de la classe Document et transmettez-lui l’expression XPath et d’autres paramètres.
- Itère sur les nœuds obtenus et les imprime sur la console.
- Vous obtiendrez une liste contenant uniquement des liens vers les photos du document HTML.
1// Use XPath to get only links to photos from HTML
2
3// Create an instance of an HTML document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "xpath-image.htm")))
5{
6 // Evaluate the XPath expression
7 IXPathResult result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 // Iterate over the resulted nodes and print them to the console
9 Node node;
10 while ((node = result.IterateNext()) != null)
11 {
12 HTMLImageElement img = (HTMLImageElement)node;
13 Console.WriteLine(img.Src);
14 }
15}
Aspose.HTML propose des applications Web HTML gratuites qui constituent une collection en ligne de convertisseurs, de fusions, d’outils SEO, de générateurs de code HTML, d’outils URL, et bien plus encore. Les applications fonctionnent sur n’importe quel système d’exploitation doté d’un navigateur web et ne nécessitent aucune installation de logiciel supplémentaire. C’est un moyen rapide et facile de résoudre efficacement vos tâches liées au HTML.