Parsel : Comment extraire du texte à partir de HTML en Python
Mihai Maxim le 31 janvier 2023

Introduction
Le web scraping est le processus automatisé de collecte de données à partir de sites web à l'aide d'un script ou d'un programme. Il est utilisé pour extraire des informations telles que du texte, des images et d'autres types de données qui peuvent être utiles à différentes fins telles que la recherche, l'analyse de données ou l'analyse de marché.
De nos jours, il existe une multitude de solutions pour faire du web scraping avec Python. Selenium et Scrapy sont parmi les bibliothèques les plus utilisées et les plus populaires. Bien que ces outils soient parfaits pour des tâches de scraping complexes, ils peuvent être un peu trop complexes pour une utilisation occasionnelle.
Voici Parsel, la petite bibliothèque de scraping. Cette bibliothèque légère et facile à apprendre est parfaite pour les petits projets et pour ceux qui débutent dans le web scraping. Elle est capable d'analyser le code HTML et d'extraire des données à l'aide de sélecteurs CSS et XPath, ce qui en fait un outil idéal pour tout amateur de données à la recherche d'un moyen rapide et facile de collecter des informations sur le web.
Attachez votre ceinture et préparez-vous à apprendre à utiliser cette bibliothèque en me rejoignant dans cette aventure de collecte automatisée de données. C'est parti pour le scraping !
Démarrer avec Parsel
Vous pouvez installer la bibliothèque Parsel avec :
pip install parsel
Maintenant, plongeons directement dans un projet d'exemple et récupérons toutes les données sur les pays à partir de ce simple site web https://www.scrapethissite.com/pages/simple/.
Pour obtenir le code HTML du site web, vous devez effectuer une requête HTTP GET.
Nous ferons des requêtes HTTP avec la bibliothèque Python "requests", assurez-vous donc de l'installer avec :
pip install requests
Vous pouvez maintenant récupérer le code HTML et l'écrire dans un fichier :
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
with open("out.html", "w", encoding="utf-8") as f :
f.write(response.text)
Examinez la structure :

Nos données sont stockées dans des structures similaires :
<div class="col-md-4 country">
<h3 class="country-name">
<i class="flag-icon flag-icon-af"></i>
Afghanistan
</h3>
<div class="country-info">
<strong>Capital:</strong> <span class="country-capital">Kabul</span><br>
<strong>Population:</strong> <span class="country-population">29121286</span><br>
<strong>Area (km<sup>2</sup>):</strong> <span class="country-area">647500.0</span><br>
</div>
</div><!--.col-->
Pour écrire des sélecteurs, vous devez transmettre le code HTML brut à Parsel :
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text = raw_html)
Nous sommes maintenant prêts à écrire quelques sélecteurs.
Extraction de texte à l'aide de sélecteurs CSS
Vous pouvez imprimer la première capitale de pays avec :
parsel_dom = parsel.Selector(text=raw_html)
first_capital = parsel_dom.css(".country-capital::text").get()
print(first_capital)
// Sortie
Andorra la Vella
parsel_dom.css(".country-capital::text").get() sélectionnera le texte intérieur du premier élément ayant la classe country-capital.
Vous pouvez imprimer tous les noms de pays avec :
countries_names = filter(lambda line : line.strip() != "", parsel_dom.css(".country-name::text").getall())
for country_name in countries_names :
print(country_name.strip())
// Output
Andorra
United Arab Emirates
Afghanistan
Antigua et Barbuda
Anguilla
. . .
parsel_dom.css(".country-name::text").getall() sélectionnera les textes intérieurs de tous les éléments ayant la classe "country-name".
Notice that we had to clean-up the output a bit. We did that because all the elements that have the “.country-name” class also have an <i> tag nested inside of them. Also, the country name is surrounded by many trailing spaces.
<h3 class="country-name">
<i class="flag-icon flag-icon-ae"></i> //this is picked up as an empty string
United Arab Emirates // this is picked up as “ United Arab Emirates “
</h3>
Écrivons maintenant un script pour extraire toutes les données à l'aide de sélecteurs CSS :
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.css(".country")
countries_data = []
for country in countries:
country_name = country.css(".country-name::text").getall()[1].strip()
country_capital = country.css(".country-capital::text").get()
country_population = country.css(".country-population::text").get()
country_area = country.css(".country-area::text").get()
countries_data.append({
"name": country_name,
"capital": country_capital,
"population": country_population,
"area": country_area
})
for country_data in countries_data:
print(country_data)
// Outputs
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}
...
Extraction de texte à l'aide de sélecteurs XPath
XPath est un langage de requête permettant de sélectionner des nœuds dans un document XML. Il est l'abréviation de XML Path Language et utilise une notation de chemin similaire à celle des URL pour naviguer à travers les éléments et les attributs d'un document XML. Les expressions XPath peuvent être utilisées pour sélectionner un seul élément, un ensemble d'éléments ou un attribut spécifique d'un élément. XPath est principalement utilisé dans XSLT, mais il peut également être utilisé pour naviguer dans le modèle d'objet de document (DOM) de n'importe quel document de langage de type XML, tel que HTML ou SVG.
XPath peut sembler intimidant au premier abord, mais il est en fait assez facile à utiliser une fois que l'on a compris les concepts et la syntaxe de base. Notre guide sur les sélecteurs XPath à l'adresse https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet est une ressource qui peut s'avérer utile.
Essayons maintenant quelques sélecteurs :
Voici comment imprimer le premier capital :
parsel_dom = parsel.Selector(text=raw_html)
first_capital = parsel_dom.xpath('//*[@class="country-capital"]/text()').get()
print(first_capital)
// Sortie
Andorra la Vella
Et tous les noms de pays :
countries_names = filter(lambda line : line.strip() != "",
parsel_dom.xpath('//*[@class="country-name"]//text()').getall())
for country_name in countries_names :
print(country_name.strip())
// Sortie
Andorra la Vella
Abu Dhabi
Kaboul
St. John's
The Valley
Tirana
...
Réimplémentons le script avec des sélecteurs XPath :
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.xpath('//div[contains(@class,"country")][not(contains(@class,"country-"))]')
countries_data = []
for country in countries:
country_name = country.xpath(".//h3/text()").getall()[1].strip()
country_capital = country.xpath(".//span/text()").getall()[0]
country_population = country.xpath(".//span/text()").getall()[1]
country_area = country.xpath(".//span/text()").getall()[2]
countries_data.append({
"name": country_name,
"capital": country_capital,
"population": country_population,
"area": country_area
})
for country_data in countries_data:
print(country_data)
// Output
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'}
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
{'name': 'Afghanistan', 'capital': 'Kabul', 'population': '29121286', 'area': '647500.0'}
...
Suppression d'éléments
La suppression d'éléments est simple. Il suffit d'appliquer la fonction "drop" à un sélecteur :
selector.css(".my_class").drop()
Présentons cette fonctionnalité en écrivant un script qui supprime le fichier "population" de chaque pays :
import parsel
import requests
response = requests.get("https://www.scrapethissite.com/pages/simple/")
raw_html = response.text
parsel_dom = parsel.Selector(text=raw_html)
countries = parsel_dom.css(".country")
for country in countries :
country.css(".country-population").drop()
country.xpath(".//strong")[1].drop()
country.xpath(".//br")[1].drop()
countries_without_population_html = parsel_dom.get()
with open("out.html", "w", encoding="utf-8") as f :
f.write(countries_without_population_html)

Exporter les données
Lorsque vous avez fini d'extraire les données, il est important de réfléchir à la manière dont vous souhaitez les sauvegarder. Les formats .json et .csv sont deux formats courants pour le stockage de ce type de données. Cependant, vous devez choisir celui qui convient le mieux aux besoins de votre projet.
Exporter les données au format .json
JSON (JavaScript Object Notation) est un format d'échange de données léger, facile à lire et à écrire pour les humains et facile à analyser et à générer pour les machines. Il est souvent utilisé pour échanger des données entre une application web et un serveur, ou entre différentes parties d'une application web. JSON est similaire à un dictionnaire Python, en ce sens qu'il est utilisé pour stocker des données dans des paires clé-valeur, et qu'il peut être utilisé pour stocker et accéder au même type de données et avoir la même structure.
L'exportation d'un tableau de dictionnaires Python au format .json peut être réalisée à l'aide de la bibliothèque json :
import json
countries_dictionaries = [
{'name': 'Andorra', 'capital': 'Andorra la Vella', 'population': '84000', 'area': '468.0'},
{'name': 'United Arab Emirates', 'capital': 'Abu Dhabi', 'population': '4975593', 'area': '82880.0'}
]
json_data = json.dumps(countries_dictionaries, indent=4)
with open("data.json", "w") as outfile:
outfile.write(json_data)
// data.json
[
{
"name": "Andorra",
"capital": "Andorra la Vella",
"population": "84000",
"area": "468.0"
},
{
"name": "United Arab Emirates",
"capital": "Abu Dhabi",
"population": "4975593",
"area": "82880.0"
}
]
Exportation des données au format .csv
Un CSV est un moyen simple de stocker des données dans un fichier texte, où chaque ligne représente une rangée et chaque valeur est séparée par une virgule. Il est souvent utilisé dans les tableurs ou les bases de données. Python dispose d'un excellent support intégré pour travailler avec des fichiers CSV, grâce à son module csv. L'une des fonctionnalités les plus puissantes du module CSV est la classe DictWriter, qui vous permet d'écrire un dictionnaire Python dans un fichier CSV de manière simple. Les clés du dictionnaire seront utilisées comme en-têtes de colonnes dans le fichier CSV, et les valeurs seront écrites comme données correspondantes dans les lignes.
Voici comment utiliser la bibliothèque csv pour exporter un tableau de dictionnaires Python au format .csv.
countries_dictionaries = [
{"name": "John Smith", "age": 35, "city": "New York"},
{"name": "Jane Doe", "age": 28, "city": "San Francisco"}
]
with open("data.csv", "w") as outfile:
writer = csv.DictWriter(outfile, fieldnames=countries_dictionaries[0].keys())
writer.writeheader()
for row in countries_dictionaries:
writer.writerow(row)
// data.csv
name,age,city
John Smith,35,New York
Jane Doe,28,San Francisco
Conclusion
Dans cet article, nous avons exploré l'utilisation de la bibliothèque Parsel en Python. Nous avons vu à quel point il est facile d'utiliser les sélecteurs CSS et XPath fournis par Parsel pour extraire des données de pages web. Dans l'ensemble, Parsel constitue une solution efficace et polyvalente pour le web scraping. Si vous êtes intéressé par l'automatisation de la collecte de données, vous devriez certainement l'essayer.
Vous voulez en savoir plus sur le web scraping ? Consultez notre produit, WebScrapingAPI, et découvrez comment vous pouvez améliorer vos compétences en matière d'extraction de données. Notre puissante API est spécialement conçue pour vous aider à relever les défis les plus courants du web scraping, comme éviter les interdictions d'IP ou le rendu de Javascript. Et le plus beau, c'est que vous pouvez l'essayer gratuitement ! Vous pouvez l'essayer gratuitement !
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.


Découvrez comment extraire et organiser efficacement des données pour le web scraping et l'analyse de données grâce à l'analyse de données, aux bibliothèques d'analyse HTML et aux métadonnées schema.org.


Les sélecteurs XPath sont-ils meilleurs que les sélecteurs CSS pour le web scraping ? Découvrez les points forts et les limites de chaque méthode et faites le bon choix pour votre projet !
