Passer au contenu

Comment utiliser les sélecteurs XPath pour le Web Scraping en Python

Si vous souhaitez extraire des données de pages Web à l'aide de Python, XPath est un outil essentiel à avoir dans votre boîte à outils de web scraping. XPath fournit un moyen de naviguer dans la structure HTML d'une page et d'identifier les éléments et données exacts dont vous avez besoin.

Dans ce guide, nous passerons en revue les bases de XPath et montrerons comment vous pouvez exploiter sa puissance pour le web scraping avec Python. À la fin, vous serez prêt à affronter une grande variété de tâches de scraping en utilisant XPath pour extraire chirurgicalement les données que vous recherchez.

Qu'est-ce que XPath?

XPath signifie XML Path Language. C'est un langage de requête permettant de sélectionner des nœuds à partir d'un document XML ou HTML. Avec XPath, vous spécifiez un modèle à faire correspondre à la structure du document, et il renverra tous les éléments qui correspondent à ce modèle.

Bien qu'il soit initialement conçu pour XML, XPath fonctionne tout aussi bien avec HTML, ce qui le rend idéal à des fins de scraping Web. Il fournit une alternative plus puissante et flexible aux sélecteurs CSS ou aux expressions régulières.

Bases de la syntaxe XPath

Pour commencer à utiliser XPath, vous devez comprendre les éléments constitutifs de la syntaxe XPath. Voici les concepts clés :

Sélection de nœuds par nom de balise

L'expression XPath la plus élémentaire consiste simplement à spécifier un nom de balise. Par exemple:

  • //h1 sélectionne tous les <h1> éléments de titre sur la page
  • //p sélectionne tous les <p> éléments de paragraphe
  • //img sélectionne tous les <img> éléments d'image

Sélection de nœuds par attribut

Vous pouvez sélectionner des éléments qui ont un attribut ou une valeur d'attribut spécifique en utilisant @ syntaxe:

  • //*[@class="highlighted"] sélectionne tous les éléments qui ont la classe "mis en surbrillance"
  • //a[@href] sélectionne tout <a> éléments d'ancrage qui ont un attribut href
  • //img[@alt="Logo"] sélectionne <img> éléments avec un texte alternatif de "Logo"

Sélection de nœuds par position

Vous pouvez sélectionner des nœuds en fonction de leur position à l'aide de crochets [] et un index numérique :

  • //ul/li[1] sélectionne le premier <li> élément dans chaque <ul> liste non ordonnée
  • //table/tr[last()] sélectionne le dernier <tr> rangée dans chaque <table>
  • //ol/li[position() <= 3] sélectionne les trois premiers <li> éléments dans chacun <ol> liste ordonnée

Sélection de nœuds par relation

XPath vous permet de naviguer de haut en bas dans l'arborescence du document pour sélectionner des éléments en fonction de leurs ancêtres, descendants, frères et sœurs, etc :

  • //div[@class="content"]/* sélectionne tous les éléments enfants de <div> éléments avec la classe "content"
  • //p/.. sélectionne les éléments parents de tous <p> paragraphes
  • //h1/following-sibling::p sélectionne tout <p> éléments qui sont frères et sœurs après un <h1> titre
  • //section//img sélectionne tout <img> éléments qui descendent d'un <section> à tout niveau

Prédicats et fonctions

XPath prend en charge un large éventail de prédicats et de fonctions pour affiner davantage vos sélections :

  • //p[contains(text(),"scrapy")] sélectionne <p> les éléments qui contiennent le texte "scrapy"
  • //a[starts-with(@href,"https")] sélectionne <a> éléments où le href commence par "https"
  • //ul[count(li) > 10] sélectionne <ul> éléments qui contiennent plus de 10 <li> articles
  • //img[string-length(@alt) > 0] sélectionne <img> éléments avec un attribut alt non vide

Utiliser XPath avec lxml et BeautifulSoup

Maintenant que vous comprenez les bases de la syntaxe XPath, voyons comment l'utiliser en Python avec les bibliothèques populaires lxml et BeautifulSoup. Nous allons passer en revue un exemple de suppression du texte du titre principal de la page d'accueil de ScrapingBee.

Analyser du HTML avec lxml et BeautifulSoup

Tout d’abord, nous devons récupérer le code HTML de la page Web à l’aide de la bibliothèque de requêtes et l’analyser dans une structure arborescente que nous pouvons interroger avec XPath. Nous utiliserons BeautifulSoup pour analyser le HTML et lxml afin d'évaluer nos expressions XPath :

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

Ici, nous :

  1. Récupérez le HTML en utilisant requests.get()
  2. Analysez la chaîne HTML dans un objet BeautifulSoup à l'aide de html.parser
  3. Convertissez l'objet BeautifulSoup en chaîne afin que nous puissions l'analyser avec les lxml etree.HTML() fonction
  4. Analyser la chaîne dans un lxml Element objet que nous pouvons interroger en utilisant XPath

Construction et évaluation d'expressions XPath

Maintenant que nous disposons d'une arborescence HTML analysée, nous pouvons construire une expression XPath pour sélectionner l'arbre HTML principal. <h1> titre sur la page :

heading_xpath = ‘//h1‘

Pour évaluer ce XPath par rapport à notre document HTML analysé, nous utilisons le xpath() méthode:

heading_elements = dom.xpath(heading_xpath)

La dom.xpath() call renverra une liste de tous les éléments correspondant à notre sélecteur XPath. Dans ce cas, il ne devrait y avoir qu'une seule correspondance <h1> .

Extraction de texte et d'attributs

Une fois que nous avons une référence à l'élément, nous pouvons facilement extraire son texte et ses éventuels attributs en utilisant les propriétés de lxml :

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

Nous avons réussi à extraire le texte du titre avec une seule ligne de XPath ! Nous pourrions également accéder aux valeurs d'attribut de l'élément en utilisant get():

heading_id = heading_elements[0].get(‘id‘)  

Utiliser XPath avec Selenium

Une approche alternative consiste à utiliser Selenium pour automatiser et supprimer les sites Web dynamiques nécessitant JavaScript. Selenium fournit ses propres méthodes pour sélectionner des éléments à l'aide de chaînes XPath.

Configuration de Selenium WebDriver

Pour démarrer avec Selenium, vous devez d'abord installer le package Selenium et un pilote Web pour le navigateur que vous souhaitez utiliser. Voici comment configurer un pilote Chrome :

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

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

Assurez-vous de télécharger la version ChromeDriver appropriée pour votre installation Chrome et de fournir le chemin d'accès à l'exécutable.

Rechercher des éléments avec XPath

Une fois le pilote configuré, nous pouvons accéder à une page Web et commencer à rechercher des éléments. Le WebDriver de Selenium fournit un find_element méthode qui accepte un localisateur XPath :

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

Semblable à l'exemple lxml, cela trouvera le premier <h1> élément sur la page. Si vous souhaitez rechercher tous les éléments correspondant à un XPath, utilisez find_elements au lieu:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

Extraction de texte et d'attributs

Une fois que vous avez une référence à un élément Web, vous pouvez accéder à ses propriétés telles que le contenu du texte et ses attributs :

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

L'extraction de données avec Selenium et XPath est assez simple, mais gardez à l'esprit que Selenium est généralement plus lent que l'utilisation d'une simple bibliothèque de requêtes HTTP puisqu'il exécute un véritable navigateur.

Conseils et bonnes pratiques

Lorsque vous commencez à utiliser XPath pour le web scraping, voici quelques trucs et astuces à garder à l’esprit :

Utilisez Chrome DevTools pour tester les expressions XPath

Lors de la construction de sélecteurs XPath, il est très utile de les tester de manière interactive pour vous assurer qu'ils correspondent à vos attentes. Les Chrome DevTools offrent un moyen simple de procéder :

  1. Faites un clic droit sur un élément et sélectionnez "Inspecter" pour ouvrir le panneau Éléments DevTools
  2. Appuyez sur Ctrl+F pour ouvrir le champ de recherche
  3. Entrez votre expression XPath pour mettre en évidence les éléments correspondants sur la page

Gérer le balisage incohérent

Les sites Web dans la nature ont souvent un balisage HTML incohérent ou cassé qui peut faire trébucher vos sélecteurs XPath. C'est une bonne idée d'utiliser une bibliothèque comme BeautifulSoup pour nettoyer et normaliser le HTML avant de l'analyser avec lxml.

Écrire un XPath robuste et maintenable

Pour minimiser les risques de rupture de votre scraper en raison de modifications de mise en page sur le site cible, essayez d'écrire des expressions XPath aussi spécifiques que possible mais pas plus spécifiques que nécessaire. Privilégiez la sélection par propriétés sémantiques telles que les noms de balises, les identifiants et les attributs de données plutôt que de vous fier à la structure spécifique du balisage.

C'est également une bonne idée de diviser les expressions XPath complexes en variables avec des noms descriptifs pour améliorer la lisibilité et la maintenabilité.

Mettre en cache les résultats pour améliorer les performances

Si vous récupérez de grandes quantités de données ou si vous consultez plusieurs fois les mêmes pages, envisagez de mettre en cache les résultats HTML et XPath analysés pour éviter les requêtes réseau inutiles et les frais d'analyse. Vous pouvez utiliser un simple dictionnaire ou une solution plus robuste comme MongoDB ou Redis pour la mise en cache.

Conclusion

XPath est un outil incroyablement puissant pour extraire avec précision les données des pages HTML. Avec une compréhension de base de la syntaxe et la capacité de traduire les sélecteurs CSS en leurs équivalents XPath, vous pouvez gérer une grande variété de tâches de web scraping.

Les bibliothèques Python telles que lxml, BeautifulSoup et Selenium offrent des moyens simples d'intégrer XPath dans vos flux de travail de scraping. En fonction de vos besoins spécifiques et des caractéristiques du site cible, vous pouvez choisir l'approche qui fonctionne le mieux.

Alors que vous poursuivez votre parcours de web scraping avec Python et XPath, assurez-vous toujours de respecter les conditions d'utilisation du site Web et les restrictions robots.txt. Et n'oubliez pas de rafraîchir les principes fondamentaux des fonctions et des opérateurs XPath : vous serez étonné de voir tout ce que vous pouvez réaliser avec seulement quelques lignes de XPath intelligent !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *