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.
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.
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 :
<h1>
, <p>
, <img>
).id
, classe
, href
).Les sélecteurs XPath et CSS sont des langages de requête utilisés pour sélectionner des éléments dans un document HTML :
Pour en savoir plus sur les sélecteurs , cliquez ici.
Avant de commencer à utiliser Parsel, vérifiez les points suivants :
pip install parsel requests
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_pod
qui 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
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 :
GET
au site web de l'exemple pour récupérer son contenu HTML.article.produit_pod
pour sélectionner la première entrée du livre dans la page.produit_pod
bloc.Titre : Une lumière dans le grenier
Prix de vente : £51.77
Disponibilité : En stock
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
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)
GET
pour récupérer le contenu HTML du site web.produit_pod
Le sélecteur CSS cible la première entrée du livre.h3 a::attr(title)
le script extrait l'attribut title de la base de données <a>
imbriquée dans la balise <h3>
étiquette.Titre du texte: Une lumière dans le grenier
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
href
) à la page détaillée du livreimport 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 :
Lien du livre : catalogue/a-light-in-the-attic_1000/index.html
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
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 :
GET
pour récupérer le contenu HTML du site web. 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..getall()
permet d'obtenir une liste de tous les titres correspondants.Titre : Une lumière dans le grenier
Titre : Tipping the Velvet
Titre : Soumission
Titre : Sharp Objects
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 :
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 :
produit_pod
.div.product_price p.price_color
il navigue dans la div et sélectionne l'élément p
contenant le prix..get()
récupère la valeur du prix.Prix: £51.77
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
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}")
ol.row
li.article
cible tous les <li> à l'intérieur de la liste ordonnée (<ol>), qui représentent des livres individuels.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.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
...
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 :
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 !