Retour au blog
Guides
Suciu DanLast updated on Apr 29, 202611 min read

XPath Web Scraping : Un guide pratique avec des exemples en Python

XPath Web Scraping : Un guide pratique avec des exemples en Python
En bref : XPath est un langage de requête permettant de parcourir des arborescences HTML/XML à l'aide de chemins, d'attributs ou de contenu textuel. Ce guide aborde la syntaxe, les axes et les fonctions de XPath, puis présente des exemples concrets de scrapers Python utilisant lxml et Selenium. Vous y trouverez également une fiche de référence complète ainsi qu'une section consacrée au dépannage des erreurs XPath les plus courantes.

XPath (XML Path Language) est un langage de requête qui sélectionne des nœuds dans des documents XML et HTML à l'aide d'expressions de chemin. Si les sélecteurs CSS vous semblent trop limités pour vos tâches de scraping, le scraping Web avec XPath est la suite logique.

Alors que les sélecteurs CSS ne se déplacent que vers l'avant et vers le bas dans le DOM, XPath parcourt le DOM dans toutes les directions : vers le haut jusqu'à un parent, latéralement vers un frère, ou en profondeur vers des descendants imbriqués. Il peut également faire correspondre des éléments en fonction de leur texte visible, une capacité dont le CSS est totalement dépourvu. Ces fonctionnalités rendent XPath particulièrement utile pour le scraping Web sur des pages complexes ou mal structurées.

Dans ce tutoriel, vous apprendrez la syntaxe de base d'XPath (chemins, prédicats, axes, fonctions), découvrirez comment tester des expressions dans votre navigateur et créerez de véritables scrapers Python avec lxml et Selenium. Nous aborderons également les pièges courants qui font échouer les sélecteurs XPath en production et comment les éviter.

Qu'est-ce que XPath et pourquoi l'utiliser pour le web scraping ?

XPath traite un document HTML ou XML comme un arbre de nœuds et vous offre une syntaxe compacte pour pointer exactement ceux dont vous avez besoin. Considérez-le comme un chemin d'accès à un fichier : tout comme /home/user/docs/file.txt navigue dans les répertoires, /html/body/div/p parcourt l'arborescence DOM jusqu'à un paragraphe spécifique.

Trois raisons pour lesquelles XPath se distingue pour le scraping :

  1. Parcours bidirectionnel. XPath remonte vers les éléments parents ou ancêtres, et ne descend pas seulement. Les sélecteurs CSS ne vont que vers l'avant.
  2. Sélection basée sur le texte. Vous pouvez trouver des éléments grâce au texte visible (par exemple, la balise <a> balise « Page suivante »), ce que le CSS ne peut pas faire.
  3. Fonctions intégrées. contains(), starts-with()et normalize-space() vous permettent de gérer des balises désordonnées sans avoir recours aux expressions régulières.

La rédaction d'expressions XPath solides est une compétence pratique qui s'avère rapidement utile dès que l'on dépasse le cadre des pages triviales. XPath est pris en charge par de nombreux langages (Python, JavaScript, C#, PHP), de sorte que la connaissance de la syntaxe est directement transférable, quelle que soit votre pile technologique.

Comment le DOM se relie aux expressions XPath

Le Document Object Model (DOM) structure chaque élément HTML, attribut et nœud de texte en une arborescence où chaque nœud possède un parent, des enfants et des frères. Prenons l'exemple du balisage suivant :

<ul id="menu">
  <li class="active">Home</li>
  <li>About</li>
</ul>

Ici <ul> est le parent. Les <li> éléments sont ses enfants et sont frères les uns des autres. L'expression XPath //ul[@id='menu']/li[1] dit : trouver tout <ul> avec id="menu", puis récupère son premier <li> . Chaque requête XPath est en fin de compte un ensemble d’instructions parcourant cette structure parent-enfant-frère, c’est pourquoi il est important de bien comprendre le DOM avant d’écrire un sélecteur.

Les bases de la syntaxe XPath

Il existe deux types de chemins XPath. Les chemins absolus partent de la racine (/html/body/div/p) et sont précis mais fragiles : un seul changement structurel les rend inutilisables. Les chemins relatifs commencent par // et parcourent l'arborescence entière, ce qui les rend bien plus résistantes pour les workflows de web scraping XPath.

Opérateur

Signification

Exemple

/

Enfant direct

/html/body/div

//

Tout descendant

//div[@class='price']

..

Nœud parent

//span/..

@

Accès aux attributs

//a[@href]

Sélection de nœuds à l'aide de prédicats

Les prédicats sont des filtres entre crochets qui restreignent un ensemble de nœuds :

//ul/li[1]                  ← first <li>
//ul/li[last()]              ← last <li>
//input[@type='email']       ← by attribute
//a[text()='Next Page']      ← by exact text
//span[contains(text(),'$')] ← by partial text

Ce sont les prédicats qui rendent les expressions XPath véritablement puissantes pour l'extraction de données. Sans eux, vous auriez besoin d'un code de post-traitement pour filtrer les correspondances indésirables de vos résultats.

Axes XPath : navigation dans toutes les directions

Les axes définissent la direction de la traversée par rapport au nœud actuel, et ils constituent l'une des principales raisons pour lesquelles les sélecteurs de web scraping XPath peuvent atteindre des éléments que le CSS ne peut tout simplement pas atteindre.

Axe

Direction

Cas d'utilisation du scraping

child::

Enfants directs

Sélectionner <li> éléments à l'intérieur d'un <ul>

descendant::

Tous les nœuds imbriqués

Récupérer tous les liens à l'intérieur d'un conteneur

parent::

Remonter d'un niveau

À partir d'un prix <span>, accéder à son produit <div>

ancestor::

Tout ancêtre

À partir d'une cellule, trouver le <table> auquel il appartient

following-sibling::

Prochains frères et sœurs

Après une <dt> étiquette, récupère la <dd> valeur

preceding-sibling::

Frères et sœurs précédents

À partir d'un élément connu, recherchez un titre

Exemple pratique de scraping d'une liste de définitions :

undefined//dt[text()='Price']/following-sibling::dd[1]

Cela récupère le premier <dd> après celui <dt> contenant « Prix ». L' following-sibling axe rend cette opération triviale, alors que le CSS nécessiterait du JavaScript supplémentaire ou une logique de wrapper.

Fonctions XPath puissantes pour l'extraction

Le code HTML réel est souvent désordonné. Les fonctions XPath vous aident à écrire des sélecteurs qui résistent aux classes dynamiques, aux espaces cachés et aux valeurs d'attributs changeantes.

contains(@class, 'product')       ← matches "product-card", "product_item"
starts-with(@id, 'listing-')      ← matches "listing-001", "listing-002"
text()                             ← targets visible text content
normalize-space()='In Stock'       ← collapses whitespace before comparing
not(contains(@class, 'ad'))        ← excludes ad containers

contains() est particulièrement utile sur les pages où les frameworks ajoutent des suffixes générés aux noms de classes. normalize-space() résout le problème frustrant où un sélecteur XPath semble correct mais échoue parce que des tabulations ou des sauts de ligne cachés entourent le texte. Ensemble, ces fonctions rendent vos expressions XPath résilientes sur les sites web réels où la cohérence du balisage n’est jamais garantie.

Aide-mémoire XPath

Ajoutez cette référence consolidée à vos favoris pour effectuer des recherches rapides lorsque vous écrivez vos sélecteurs XPath de scraping Web.

Catégorie

Syntaxe

Fonction

Chemin

//tag

Toutes les balises correspondantes, où qu'elles se trouvent

Chemin

/parent/child

Enfant direct

Chemin

..

Nœud parent

Prédicat

[n]

N-ième élément (à partir de 1)

Prédicat

[@attr='val']

Filtrer par attribut

Axe

ancestor::tag

Tout ancêtre

Axe

following-sibling::tag

Frère suivant

Fonction

contains()

Correspondance partielle de chaîne

Fonction

normalize-space()

Supprimer les espaces

Fonction

text()

Sélectionner le contenu textuel

Pour une couverture plus approfondie des opérateurs et des expressions composées, notre aide-mémoire XPath fournit une référence détaillée.

Tester XPath dans les outils de développement du navigateur

Avant d'écrire du code, validez vos expressions XPath dans le navigateur. Ouvrez les outils de développement (F12), accédez au panneau Éléments, puis appuyez sur Ctrl+F (Cmd+F sur Mac). La barre de recherche accepte les expressions XPath et met en surbrillance les nœuds correspondants en temps réel.

Vous pouvez également cliquer avec le bouton droit sur n'importe quel élément et choisir Copier > Copier le XPath. Attention : le navigateur génère des chemins absolus tels que /html/body/div[3]/section[1]/ul/li[2]/a qui ne fonctionnent plus en cas de modification structurelle. Réécrivez toujours les chemins générés automatiquement en expressions relatives ancrées sur des attributs stables (ID, data-* noms de classes sémantiques) plutôt que des indices de position.

Web scraping avec XPath et Python : étape par étape

Mettons XPath en pratique avec Python. Les deux bibliothèques les plus courantes pour le web scraping avec XPath en Python sont lxml (HTML statique) et Selenium (pages rendues en JavaScript). Ci-dessous, nous ciblons le même site avec les deux afin que vous puissiez comparer directement l'ergonomie des API.

Utilisation de XPath avec lxml

lxml est une bibliothèque rapide, basée sur le langage C et construite sur libxml2. Si la page ne nécessite pas de JavaScript, lxml est le bon choix.

import requests
from lxml import html

response = requests.get("https://books.toscrape.com/")
tree = html.fromstring(response.content)
titles = tree.xpath('//article[@class="product_pod"]/h3/a/@title')
for title in titles:
    print(title)

Récupérer le HTML avec requests, analysez avec html.fromstring()et interrogez avec .xpath(). Le résultat est une simple liste Python. Pour des modèles de scraping Python plus avancés, notre guide sur le scraping web avec Python traite en détail de la gestion des requêtes et du stockage des données.

Utilisation de XPath avec Selenium

Lorsque les pages affichent du contenu via JavaScript, vous avez besoin d'un moteur de navigateur. Selenium pilote un navigateur sans interface graphique et expose XPath via find_elements. À partir de Selenium 4, le WebDriver serait intégré au paquet (vérifiez dans les notes de mise à jour actuelles de Selenium avant de vous fier à cette information).

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://books.toscrape.com/")
elements = driver.find_elements(By.XPATH, '//article[contains(@class,"product_pod")]/h3/a')
for el in elements:
    print(el.get_attribute("title"))
driver.quit()

L'XPath est presque identique à la version lxml. La différence réside dans l'API : .xpath() par rapport à find_elements(By.XPATH, ...). Pour en savoir plus sur les workflows des navigateurs sans interface graphique, notre tutoriel sur le scraping avec Selenium et Python présente les modèles d'automatisation. Choisissez lxml pour les pages statiques et n'utilisez un navigateur sans interface graphique que lorsque l'exécution de JavaScript est vraiment nécessaire.

Sélecteurs XPath vs CSS : quand utiliser lequel

Critères

XPath

Sélecteurs CSS

Direction

Vers le haut, vers le bas, latéralement

Vers l'avant uniquement

Correspondance de texte

Native (text(), contains())

Non pris en charge

Lisibilité

Détaillé mais explicite

Concis

Performances

À peu près équivalentes en pratique

Légèrement plus rapide lors des tests de performance

Courbe d'apprentissage

Plus raide

Plus facile

Utilisez CSS lorsque les cibles sont accessibles uniquement par classe ou par ID. Utilisez XPath pour les tâches de scraping nécessitant une traversée des éléments parents, une correspondance de texte ou une navigation multi-axes. De nombreux scrapers expérimentés combinent librement les deux. Pour une comparaison plus approfondie, notre page « XPath vs CSS selectors » couvre des cas limites supplémentaires et des stratégies de sélection.

En termes de performances, XPath est parfois considéré comme plus lent, bien que l'écart soit généralement négligeable lorsque la latence du réseau domine votre charge de travail de scraping. La vitesse du sélecteur devient rarement le goulot d'étranglement dans les projets réels.

Erreurs courantes avec XPath et comment les corriger

Chemins générés automatiquement instables. Les XPath copiés depuis le navigateur utilisent des indices absolus. Réécrivez-les pour les ancrer sur des attributs stables tels que @id ou @data-testid.

les conflits d'espaces de noms. Si XPath ne renvoie aucun résultat sur les pages XHTML, les préfixes d'espaces de noms interfèrent probablement. Utilisez local-name() pour les contourner : //*[local-name()='div'].

Incohérences dans les espaces. text()='In Stock' échoue lorsque la source contient des sauts de ligne ou des tabulations cachés. Enveloppez la vérification dans normalize-space() pour réduire d'abord les espaces.

Noms de classes dynamiques. Les frameworks tels que React génèrent des noms de classes hachés (par exemple, card__a3xK2). Utilisez contains(@class, 'card') pour ne faire correspondre que le préfixe stable.

Testez vos sélecteurs XPath sur un petit échantillon avant de passer à des milliers de pages. Le débogage d'un sélecteur défectueux sur une seule page est simple ; le déboguer après l'exécution d'un gros lot fait perdre du temps et de la bande passante.

Points clés

  • XPath permet de parcourir le code HTML dans toutes les directions, ce qui le rend plus polyvalent que les sélecteurs CSS pour les tâches de scraping complexes.
  • Privilégiez toujours les chemins relatifs (//) aux chemins absolus pour que les sélecteurs restent résistants aux modifications du DOM.
  • Utilisez des fonctions telles que contains(), normalize-space()et text() pour gérer les balises désordonnées du monde réel.
  • Pour le HTML statique, lxml est l'option Python la plus rapide. Réservez Selenium aux pages nécessitant un rendu JavaScript.
  • Testez d'abord chaque expression XPath dans les DevTools du navigateur, puis réécrivez les chemins générés automatiquement pour utiliser des ancrages stables.

FAQ

Le XPath est-il meilleur que les sélecteurs CSS pour le web scraping ?

Aucun des deux n'est universellement meilleur. XPath excelle lorsque vous avez besoin d'une traversée des éléments parents, d'une correspondance basée sur le texte ou d'un filtrage complexe. Les sélecteurs CSS sont plus rapides à écrire pour des sélections simples de classes ou d'identifiants et ont tendance à offrir des performances légèrement supérieures dans les benchmarks synthétiques. La plupart des scrapers de production utilisent les deux, en choisissant celui qui convient le mieux à chaque tâche de sélection spécifique.

XPath peut-il extraire des pages rendues par JavaScript ?

XPath est un langage de requête, pas un moteur de rendu. Il fonctionne sur n'importe quel DOM qu'il reçoit. Pour extraire du contenu rendu par JavaScript, vous devez d'abord disposer d'un outil qui exécute le JavaScript de la page (comme un navigateur sans interface graphique), puis appliquer des expressions XPath au DOM résultant. Les analyseurs statiques ne voient que la réponse brute du serveur avant tout rendu côté client.

Quelle bibliothèque Python est la mieux adaptée au web scraping avec XPath ?

Pour les pages statiques, lxml est la référence : rapide, bien documentée et s'appuyant sur des bibliothèques C éprouvées. Pour les pages dynamiques, Selenium offre une prise en charge de XPath via son find_elements API. Scrapy offre également une prise en charge native de XPath via sa classe Selector, ce qui en fait un choix solide pour les pipelines de crawling complets.

Pourquoi le code XPath copié depuis Chrome DevTools échoue-t-il parfois ?

Chrome génère des chemins absolus avec des indices de position basés sur le DOM en temps réel, qui peut inclure des éléments injectés par JavaScript ou des extensions de navigateur. Lorsque votre parseur traite le code HTML brut (avant l'exécution de JS), la structure diffère, de sorte que les indices de position pointent vers les mauvais éléments. Réécrivez l'expression en utilisant des attributs stables plutôt que des positions.

Conclusion

Le web scraping avec XPath vous offre un niveau de précision que les méthodes de sélection plus simples ne peuvent égaler. Grâce à la syntaxe, aux axes, aux fonctions et aux modèles Python abordés ici, vous devriez être en mesure de tout gérer, de la sélection d'attributs de base à la navigation dans des pages profondément imbriquées et à la structure irrégulière.

La clé de l'amélioration réside dans la pratique : commencez par une cible simple, testez les expressions dans DevTools et ajoutez progressivement de la complexité. Utilisez des sélecteurs relatifs, appuyez-vous sur les fonctions pour gérer la variabilité du balisage et validez toujours sur un petit lot avant de passer à l'échelle.

Lorsque les protections anti-bot, les CAPTCHA ou la gestion des proxys commencent à prendre plus de temps que votre logique XPath proprement dite, WebScrapingAPI gère la couche de requêtes à votre place, en gérant la rotation des proxys et les contre-mesures de blocage derrière un point de terminaison unique, afin que vous puissiez vous concentrer sur des sélecteurs propres et le traitement des données.

À propos de l'auteur
Suciu Dan, cofondateur @ WebScrapingAPI
Suciu Dancofondateur

Suciu Dan est le cofondateur de WebScrapingAPI et rédige des guides pratiques destinés aux développeurs sur le web scraping avec Python et Ruby, ainsi que sur les infrastructures de proxy.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.