Introduction à l'analyse web en Python avec Parsel

Python, Jan-03-20255 minutes de lecture

Le web scraping est devenu une compétence essentielle pour les développeurs Python, les data scientists et les amateurs de web scraping. Qu'il s'agisse d'extraire des données à des fins d'analyse, de créer un outil de comparaison de prix ou d'automatiser l'extraction de contenu, l'analyse syntaxique du Web est au cœur de chacune de ces tâches. Mais qu'est-ce qui rend l'analyse syntaxique du web à la fois efficace et conviviale pour les débutants ? Voici Parsel, unepuissante bibliothèque en Python qui simplifie l'analyse HTML et l'extraction de données.

Introduction à Parsel

Qu'est-ce que le Web Parsing et pourquoi est-il important ?

Parsel est une bibliothèque Python légère conçue pour l'analyse HTML/XML et l'extraction de données. Conçue pour le web scraping, Parsel facilite l'interaction avec les structures des pages web en utilisant de puissants sélecteurs tels que XPath et CSS. Ces outils vous permettent de localiser et d'extraire avec précision des éléments ou des attributs spécifiques des pages web. L'intégration de Parsel dans l'écosystème Python signifie également qu'il fonctionne de manière transparente avec des bibliothèques telles que `requests` et `httpx` pour récupérer du contenu web.

Principales caractéristiques de Parsel

  • Prise en charge des sélecteurs : Utilisez XPath pour une navigation détaillée ou les sélecteurs CSS pour une syntaxe plus simple.
  • Flexibilité : Il prend en charge de nombreuses tâches d'analyse HTML/XML, de la simple extraction de texte à la gestion d'éléments profondément imbriqués.
  • Évolutivité : Parsel peut extraire des données d'une seule page ou de plusieurs pages via des structures en boucle.
  • Intégration avec Scrapy : La compatibilité de Parsel s'étend naturellement à Scrapy, un cadre de scraping web populaire.

Cas d'utilisation courants

  • Le Web Scraping : Extraction de données à partir de sites de commerce électronique pour la surveillance des prix.
  • Exploration de données : Collecte d'informations de contact ou de données de recherche à partir d'archives publiques.
  • Automatisation : Rationalisation des tâches répétitives telles que le téléchargement des spécifications des produits.

Comprendre les sélecteurs et l'analyse HTML

Qu'est-ce que l'analyse HTML ?

L'analyse HTML est le processus de décomposition d'un document HTML en ses composants structurels, tels que les balises, les attributs et le modèle d'objet du document (DOM). Parsel utilise cette structure pour localiser et extraire avec précision les données dont vous avez besoin.

Les documents HTML sont construits en utilisant :

  • Tags : Définir le type d'élément (par ex., <h1>, <p>, <img>).
  • Attributs : Fournir des informations supplémentaires sur un élément (par ex, id, classe, href).
  • DOM : Représentation hiérarchique de la page web, qui permet la navigation entre les éléments.

Que sont les sélecteurs ?

Les sélecteurs XPath et CSS sont des langages de requête utilisés pour sélectionner des éléments dans un document HTML :

  • XPath : Puissant et riche en fonctionnalités, XPath vous permet de sélectionner des nœuds en fonction de leur chemin dans le DOM, des relations parent-enfant et des conditions.
  • Sélecteurs CSS : Une syntaxe plus simple souvent utilisée dans le développement frontal, idéale pour sélectionner des éléments sur la base de classes, d'ID ou de pseudo-sélecteurs.

Pour en savoir plus sur les sélecteurs , cliquez ici.

Conditions préalables

Avant de commencer à utiliser Parsel, vérifiez les points suivants :

  • Python installé : Téléchargez et installez Python à partir de
  • Installer les bibliothèques requises(parsel, requests) : 
pip install parsel requests

Techniques de parsel pour l'analyse HTML

Extraction d'éléments par ID et par classe

Parsel nous permet d'analyser un élément en connaissant simplement son nom de classe ou son ID. Ceci est particulièrement utile pour cibler des éléments spécifiques d'une page web pour l'extraction de données.

Pour illustrer notre propos, nous utiliserons l'exemple suivant exemple de site web. Nous nous concentrerons sur l'extraction de données à partir d'un élément portant le nom de classe produit_podqui représente une seule entrée dans le livre.

Vous trouverez ci-dessous un exemple de sa structure HTML :

De cet élément, nous extrairons

  • Titre du livre
  • Prix du livre
  • Statut de disponibilité

Exemple de code Python

import requêtes
from parsel import Selector

# Récupérer la page web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Sélectionner le premier produit par classe
product = selector.css("article.product_pod").get()

# Analyse les détails du produit sélectionné
product_selector = Selector(text=product)
title = product_selector.css("h3 a::attr(title)").get()
prix = product_selector.css("p.price_color::text").get()
availability = product_selector.css("p.instock.availability::text").get().strip()

print("Titre :", titre)
print("Prix :", prix)
print("Disponibilité :", disponibilité)

Explication du script :

  • Récupérer la page web : Le script envoie un GET au site web de l'exemple pour récupérer son contenu HTML.
  • Sélectionnez le bloc de produits : Il utilise le sélecteur CSS article.produit_pod pour sélectionner la première entrée du livre dans la page.
  • Analyser les détails du produit : Le script extrait le titre, prixet disponibilité en ciblant des balises et des attributs HTML spécifiques dans le produit_pod bloc.
  • Afficher les résultats : Les données extraites sont imprimées sur la console dans un format lisible.

Exemple de sortie

Titre : Une lumière dans le grenier
Prix de vente : £51.77
Disponibilité : En stock

Extraction de texte à partir d'éléments

Parsel facilite l'extraction de texte à partir d'éléments HTML, qu'il s'agisse d'un titre, d'une description ou d'un autre contenu visible sur une page web.

Pour la démonstration, nous utiliserons le même exemple de site web de nouveau. Nous allons nous concentrer sur l'extraction du titre d'un seul livre à l'aide de la fonction h3 à l'intérieur d'un élément d'article avec la classe produit_pod.

Vous trouverez ci-dessous un exemple de sa structure HTML :

De cet élément, nous extrairons

  • Le texte du titre du livre

Exemple de code Python

import requêtes
from parsel import Selector

# Récupérer la page web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Sélectionner le premier produit par classe
product = selector.css("article.product_pod").get()

# Analyse le texte du titre du produit sélectionné
product_selector = Selector(text=produit)

title_text = product_selector.css("h3 a::attr(title)").get()
print("Texte du titre :", texte_du_titre)

Explication du script :

  • Récupérer la page web : Le script envoie un GET pour récupérer le contenu HTML du site web.
  • Sélectionnez le bloc de produits : L'article.produit_pod Le sélecteur CSS cible la première entrée du livre.
  • Extraire le texte du titre : Utilisation h3 a::attr(title)le script extrait l'attribut title de la base de données <a> imbriquée dans la balise <h3> étiquette.
  • Afficher le résultat : Le titre extrait est imprimé sur la console.

Exemple de sortie

Titre du texte: Une lumière dans le grenier

Extraction d'attributs (par exemple, `href`, `src`, `alt`)

Parsel nous permet également d'extraire les valeurs des attributs, tels que href, src ou alt, des éléments HTML. Ces attributs contiennent souvent des données précieuses telles que des URL, des sources d'images ou du texte descriptif.

Nous nous concentrerons sur l'extraction du lien (href) à la page détaillée d'un livre à partir de la page <a> à l'intérieur d'une balise article avec la classe produit_pod.

Vous trouverez ci-dessous un exemple de sa structure HTML :

De cet élément, nous extrairons

  • Le lien (href) à la page détaillée du livre

Exemple de code Python

import requêtes
from parsel import Selector

# Récupérer la page web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Sélectionner le premier produit par classe
product = selector.css("article.product_pod").get()

# Analyse l'attribut 'href' du produit sélectionné
product_selector = Selector(text=product)
book_link = product_selector.css("h3 a::attr(href)").get()

print("Lien du livre :", book_link)

Explication du script :

  • Récupérer la page web : Le script envoie une requête GET pour récupérer le contenu HTML du site web.
  • Sélectionnez le bloc produit : Le sélecteur CSS article.product_pod cible la première entrée du livre.
  • Extraire l'attribut href : En utilisant h3 a::attr(href), le script extrait la valeur href de la balise imbriquée dans la balise.
  • Afficher le résultat : L'URL extraite est imprimée sur la console.

Exemple de sortie

Lien du livre : catalogue/a-light-in-the-attic_1000/index.html

Extraction de listes d'éléments

Parsel facilite l'extraction de plusieurs éléments d'une page web à l'aide de sélecteurs CSS ou XPath. Ceci est particulièrement utile lorsque l'on travaille avec des listes, telles que des titres de produits, des liens ou des prix.

Nous allons nous concentrer sur l'extraction d'une liste de tous les titres de livres affichés sur la page d'accueil du site web d'exemple que nous utilisons pour ce tutoriel.

Vous trouverez ci-dessous un exemple de la structure HTML correspondante :

De ces éléments, nous extrairons

  • Les titres de tous les livres affichés sur la page d'accueil

Exemple de code Python

import requêtes
from parsel import Selector

# Récupérer la page web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Sélectionner tous les titres de livres
book_titles = selector.css("article.product_pod h3 a::attr(title)").getall()

# Imprimer chaque titre
for title in book_titles :
   print("Titre :", titre)

Explication du script :

  • Récupérer la page web : Le script envoie un GET pour récupérer le contenu HTML du site web.
  • Sélectionnez tous les titres : L'utilisation de la CSS sélecteur article.product_pod h3 a::attr(title)il sélectionne tous les <a> étiquettes à l'intérieur <h3> balises au sein de produit_pod éléments.
  • Titres d'extraits : Le .getall() permet d'obtenir une liste de tous les titres correspondants.
  • Afficher les résultats : Chaque titre de la liste est imprimé un par un.

Exemple de sortie

Titre : Une lumière dans le grenier
Titre : Tipping the Velvet
Titre : Soumission
Titre : Sharp Objects

Navigation dans les éléments imbriqués

Parsel permet de naviguer efficacement dans des structures HTML complexes et imbriquées à l'aide de sélecteurs CSS et de XPath. Cela est particulièrement utile pour extraire des données enfouies dans plusieurs couches de balises HTML.

Nous allons extraire le prix d'un livre à partir de la base de données de la produit_pod élément.

Vous trouverez ci-dessous un exemple de la structure HTML correspondante :

De cette structure imbriquée, nous extrairons :

  • Le prix du premier livre

Exemple de code Python

import requêtes
from parsel import Selector

# Récupérer la page web
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Sélectionner le premier produit par classe
product = selector.css("article.product_pod").get()

# Analyse l'élément de prix imbriqué
product_selector = Selector(text=product)
price = product_selector.css("div.product_price p.price_color::text").get()

print("Prix :", prix)

Explication du script :

  • Récupérer la page web : Le script récupère le contenu HTML de la page web à l'aide de requêtes.
  • Sélectionnez le premier bloc de produits : Il cible la première balise de l'article avec la classe produit_pod.
  • Naviguer vers l'élément de prix imbriqué : L'utilisation de la CSS sélecteur div.product_price p.price_coloril navigue dans la div et sélectionne l'élément p contenant le prix.
  • Extraire le texte du prix : Le .get() récupère la valeur du prix.
  • Afficher le résultat : Le prix extrait est imprimé.

Exemple de sortie

Prix: £51.77

Analyse des tableaux et des listes

Parsel simplifie le processus d'extraction de données structurées à partir de listes HTML et de formats de type tableau. Les sites web affichent souvent des informations sous forme de motifs répétitifs, tels que des grilles de produits ou des listes ordonnées, ce qui fait de Parsel un outil essentiel pour capturer efficacement ces données.

A titre d'exemple, nous travaillerons à nouveau avec la même exemple de site web. Notre objectif est d'extraire une liste de titres de livres avec leurs prix. Plus précisément, nous allons cibler les <ol> qui contient plusieurs <li> représentant chacun un livre individuel.

Vous trouverez ci-dessous un exemple de la structure HTML correspondante :

De cette structure, nous extrairons

  • Le titre de chaque livre
  • Le prix de chaque livre

Exemple de code Python

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

Explication du script :

  • Récupérer la page web : Le script envoie une requête GET pour récupérer le contenu HTML du site web.
  • Sélectionnez tous les éléments du livre : Le sélecteur ol.row li.article cible tous les <li> à l'intérieur de la liste ordonnée (<ol>), qui représentent des livres individuels.
  • Extraire le titre et le prix : h3 a::attr(title) extrait l'attribut title de l'élément <a> tag. --- p.price_color::text extrait le texte du prix de la <p> étiquette.
  • Afficher les résultats : Le script imprime le titre et le prix de chaque livre.

Exemple de sortie

Titre : A lumière dans le grenier | Prix : £51.77
Titre : Le pourboire Le Le velours | Prix : £53.74
Titre : Soumission | Prix de vente : £50.10
Titre : Sharp Objet | Prix de vente : £47.82
...

Conclusion

Dans ce tutoriel, nous avons exploré les principes fondamentaux de l'analyse web en Python avec Parsel. De la compréhension des sélecteurs de base à la navigation dans les éléments imbriqués, en passant par l'extraction des attributs et l'analyse des listes, nous avons montré comment Parsel simplifie le processus d'extraction de données significatives à partir de pages web.

Voici un bref récapitulatif de ce que nous avons couvert :

  • Extraction d'éléments par ID et par classe : Ciblage d'éléments HTML spécifiques à l'aide de sélecteurs CSS.
  • Extraction de texte et d'attributs : Apprendre à extraire le contenu textuel et les attributs tels que href et src des éléments.
  • Gestion des éléments imbriqués : Comment naviguer à travers les relations parent-enfant dans les structures HTML.
  • Analyse de listes : Extraction de données structurées à partir de modèles répétitifs, tels que des tableaux ou des listes de produits.

Prochaines étapes :

  • Expérimentez différentes pages web et des structures HTML complexes à l'aide de Parsel.
  • Explorer l'intégration avec d'autres bibliothèques comme Scrapy pour des projets de web scraping à grande échelle.
  • Suivez les meilleures pratiques de scraping éthique, telles que le respect des fichiers robots.txt et l'absence de surcharge des serveurs.

Parsel est un outil puissant dans la boîte à outils du web scraping, et sa maîtrise ouvrira d'innombrables possibilités de collecte et d'analyse de données.

Bonne analyse !