Retour au blog
Guides
Mihai Maxim31 janvier 20237 min de lecture

Parsel : Comment extraire du texte d'un fichier HTML en Python

Parsel : Comment extraire du texte d'un fichier HTML en Python

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 sert à extraire des informations telles que du texte, des images et d'autres types de données pouvant être utiles à différentes fins, comme la recherche, l'analyse de données ou l'analyse de marché.

De nos jours, il existe une multitude de solutions pour le web scraping avec Python. Selenium et Scrapy comptent parmi les bibliothèques les plus utilisées et les plus populaires. Si ces outils sont parfaits pour les tâches de scraping complexes, ils peuvent s'avérer un peu intimidants pour une utilisation occasionnelle.

Découvrez Parsel, la petite bibliothèque de scraping. Cette bibliothèque légère et facile à prendre en main est parfaite pour les petits projets et idéale 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 excellent outil pour tout amateur de données à la recherche d’un moyen rapide et simple de collecter des informations sur le web.

Accrochez-vous 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 !

Premiers pas avec Parsel

Vous pouvez installer la bibliothèque Parsel avec :

pip install parsel

Passons maintenant directement à un exemple de projet et récupérons toutes les données sur les pays à partir de ce site web simple : https://www.scrapethissite.com/pages/simple/.

Pour récupérer le code HTML du site web, vous devrez effectuer une requête HTTP GET.

Nous effectuerons ces requêtes HTTP à l'aide de 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)

Et examinez la structure :

Code editor showing HTML markup for country cards with capitals, population, and area fields

Nos données sont stockées dans des structures similaires à celle-ci :

<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 devrez 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 des sélecteurs.

Extraction de texte à l&#x27;aide de sélecteurs CSS

Vous pouvez afficher la capitale du premier pays avec :

parsel_dom = parsel.Selector(text=raw_html)

first_capital = parsel_dom.css(".country-capital::text").get()

print(first_capital)

// Output

Andorra la Vella
parsel_dom.css(".country-capital::text").get() will select the inner text of the first element that has the country-capital class.

Vous pouvez afficher 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 and Barbuda

Anguilla

. . .
parsel_dom.css(".country-name::text").getall() will select the inner texts of all the elements that have the "country-name" class. 

Notez que nous avons dû nettoyer un peu le résultat. Nous l'avons fait car tous les éléments ayant la classe « .country-name » contiennent également une balise <i> imbriquée. De plus, le nom du pays est entouré de nombreux espaces à la fin.

<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&#x27;aide de sélecteurs XPath

XPath est un langage de requête permettant de sélectionner des nœuds dans un document XML. Il signifie « XML Path Language » et utilise une notation de chemin similaire à celle des URL pour naviguer parmi les éléments et les attributs d’un document XML. Les expressions XPath peuvent être utilisées pour sélectionner un élément unique, un ensemble d’éléments ou un attribut spécifique d’un élément. XPath est principalement utilisé en XSLT, mais il peut également servir à naviguer dans le Document Object Model (DOM) de tout document en langage de type XML, tel que HTML ou SVG.

XPath peut sembler intimidant au premier abord, mais il est en réalité assez facile de s'y mettre une fois que l'on a compris les concepts de base et la syntaxe. Notre guide des sélecteurs XPath, disponible à l'adresse https://www.webscrapingapi.com/the-ultimate-xpath-cheat-sheet, peut s'avérer très utile.

Essayons maintenant quelques sélecteurs :

Voici comment afficher la première lettre majuscule :

parsel_dom = parsel.Selector(text=raw_html)

first_capital = parsel_dom.xpath('//*[@class="country-capital"]/text()').get()

print(first_capital)

// Output

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())

// Output

Andorra la Vella

Abu Dhabi

Kabul

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'}

...

Supprimer des éléments

La suppression d'éléments est simple. Il suffit d'appliquer la fonction drop à un sélecteur :

selector.css(".my_class").drop()

Illustrons cette fonctionnalité en écrivant un script qui supprime le champ « 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)
Web page showing a list of countries with capital and area values in a multi-column layout

Exporter les données

Une fois le scraping des données terminé, il est important de réfléchir à la manière dont vous souhaitez les enregistrer. Les formats .json et .csv sont couramment utilisés pour stocker ce type de données. Cependant, vous devez choisir celui qui correspond 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 sous forme de paires clé-valeur, et qu'il permet de stocker et d'accéder à des données de même type et de même structure.

L'exportation d'un tableau de dictionnaires Python au format .json peut être effectué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"

   }

]

Exporter les données au format .csv

Un fichier CSV est un moyen simple de stocker des données dans un fichier texte, où chaque ligne représente une ligne et chaque valeur est séparée par une virgule. Il est souvent utilisé dans les tableurs ou les programmes de base de données. Python offre une excellente prise en charge intégrée pour travailler avec les 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 offre une solution efficace et polyvalente pour le web scraping. Si vous souhaitez automatiser la collecte de données, vous devriez absolument l'essayer.

Vous souhaitez en savoir plus sur le web scraping ? Découvrez notre produit, WebScrapingAPI, et voyez comment vous pouvez faire passer vos compétences en extraction de données au niveau supérieur. Notre API puissante est spécialement conçue pour vous aider à surmonter les défis les plus courants du web scraping, comme éviter les interdictions d'IP ou le rendu de Javascript. Et le meilleur dans tout ça ? Vous pouvez l'essayer gratuitement !

À propos de l'auteur
Mihai Maxim, Développeur Full Stack @ WebScrapingAPI
Mihai MaximDéveloppeur Full Stack

Mihai Maxim est développeur Full Stack chez WebScrapingAPI ; il participe à l'ensemble du produit et contribue à la création d'outils et de fonctionnalités fiables pour la plateforme.

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.