Accueil > Enseignement > Récupérer les données d’une page internet avec Python

Récupérer les données d’une page internet avec Python

mercredi 22 avril 2026, par S. Téletchéa

En bioinformatique, il est courant de devoir récupérer les informations de différents endroits pour les recouper et les organiser différemment. Par exemple, une liste de gènes d’intérêt peut être identifiée sur le site du National Center for Biotechnology Information (NCBI). Les maladies associées à ces gènes vont être disponibles sur le site Online Mendellian Inheritance In Men (OMIM). Grâce aux projets de séquençage à haut débit, les changements nucléotidiques simples (Single Nucleotide Polymorphism) sont disponibles sur le site du Broad Institute : Genome Aggregration Database (gnomAD). Dans cette dernière base de données, la diversité des séquences de chacun de nos gènes est décrite, mais la conséquence de ces changements nucléotidiques est souvent inconnue. Pour terminer cette introduction rapide sur les sources de données, il faut noter que les données sur les protéines vont être accessibles sur le site UniProt et que les structures des protéines vont être disponibles sur la Protein Data Bank.

En pratique, cela veut dire que l’on peut récupérer beaucoup d’informations de manière assez rapide, en se rendant sur chacun des sites un par un, puis en recoupant celles-ci dans un fichier texte ou dans un tableur. Ce travail est essentiel en biologie, mais très vite fastidieux, car il existe plusieurs allèles d’un gène, au moins une dizaine de SNP par allèle, au moins une protéine par allèle, et très fréquemment plusieurs structures du même gène, par exemple de la protéine libre et de la protéine liée à une petite molécule ou à un autre partenaire protéique. Dans ce cas, cela devient très vite compliqué d’assembler de manière claire ces informations. C’est là que python intervient.

Python, requests et BeautifulSoup

Le langage python a été inventé par Guido van Rossum pour enseigner l’informatique. La courbe d’apprentissage du langage est rapide, car sa syntaxe est claire et concise. Il est possible d’écrire un programme sous forme de suite d’instructions à réaliser, mais très vite, il est plus clair d’organiser chaque élément en fonction, ce qui va permettre de réutiliser des éléments du code.

Quand certaines fonctions couvrent des besoins qui vont être transversaux, que chaque développeuse ou développeur va utiliser, les auteurs de ces fonctions les regroupent dans des paquets python que l’on va pouvoir appeler en début de notre programme pour les utiliser.

La librairie requests permet de récupérer le contenu d’une page internet, mais aussi d’interagir avec, par exemple pour remplir et envoyer un formulaire automatiquement.

La librairie beautifulsoup permet de parcourir le contenu d’une page internet qui a été téléchargée, d’analyser sa structure, et de récupérer des éléments selon un mot-clé, une balise (tag) ou tout autre élément remarquable.

Accéder aux informations biologiques

La plupart du temps, les sites indiqués ci-dessus vont fournir une interface d’interrogation programmatique, ou Application Programming Interface : API, qui permet de communiquer directement avec le site d’intérêt. Pour UniProt il est ainsi possible de récupérer la séquence d’une protéine directement via un lien, comme cela est indiqué dans la documentation officielle ici : https://www.uniprot.org/help/api. Pour chacun des autres sites mentionnés, il faudra utiliser une syntaxe spécifique, mais le principe est le même, une manière d’accéder à une information précise est prévue.

Dans la suite de l’article, nous allons traiter un cas générique pour illustrer comment python peut nous aider dans l’extraction de données sur des pages génériques.

Organisation d’une page internet (web)

Une page internet est un document texte organisée avec des éléments ouvrants et fermants pour définir du contenu à interpréter par le navigateur web ou à afficher pour l’utilisateur. Chaque balise, que l’on traduit donc par markup en Anglais, va avoir un rôle unique, indiqué rapidement ci-dessous :

  • balise p : sert à délimiter un élément de paragraphe. Un paragraphe va correponsdre à un bloc de texte qui se termine par un retour à la ligne forcé. Utilisation : <p>le texte</p>
  • balise b : sert à indiquer un élément en gras (bold en Anglais). Utilisation : <b>le texte</b>
  • balise i : sert à mettre un élément en italique. Utilisation : <i>le texte</i>

Il existe d’autres balises (head, body, h1, h2, ...) qui servent à délimiter d’autres éléments de la page, qui ne sont pas détaillées ici. Pour une liste plus complète, il vaut mieux se référer aux sites établis (https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements).

Il est possible de retenir que l’ensemble d’une page internet est consituée d’un bloc principal défini par la balise <html> ... contenu ... </html>, qu’à l’intérieur de ce bloc se situent deux autres blocs, <head> ... diverses commandes ... </head> qui contient les instructions pour le navigateur, les élements de style et l’appel aux bibliothèques javascript, et enfin la partie du corps de la page celle qui est visible pour l’utilisateur, définie par la balise <body> ... contenu visibile pour l'utilisateur ... </body>.

La complexité de lecture d’une page web par un humain vient du fait que ces balises sont imbriquées les unes dans les autres, et que souvent les espaces sont enlevés pour optimiser le chargement et l’interprétation des pages.

Cas pratique : lister toutes les maladies génétiques à gène identifié

Une page wikipédia recense des maladies où un gène unique est lié à une maladie : https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9.

Cette liste est affichée sous forme d’un tableau qui a comme titres de colonnes :

  • Nom
  • OMIM
  • Transmission
  • Chromosome
  • Type de mutation
  • Gène en cause

Ce tableau est défini en HTML par la balise <table> contenu du tableau </table>, chaque ligne du tableau est définie avec la balise <tr> ... contenu de la ligne ... </tr> puis chaque cellule est délimitée par la balise <td> contenu de la cellule ... </td>.

Il est possible de voir l’organisation du tableau en faisant un clic droit sur la page et en choisissant l’entrée de menu "Afficher le code source de la page".

Nous allons maintenant utiliser python pour récupérer le contenu de la page et transformer le tableau en données exploitables. A ce stade, il faut noter qu’il est aussi possible de ne sélectionner à la souris que le tableau et de le copier dans un tableur (Microsoft Excel, LibreOffice Calc, etc) qui devrait reconnaître le format et récupérer les éléments (le temps de traitement peut être un peu long).

Version 1 : téléchargement de la page avec requests

Nous allons utiliser la librairie requests pour télécharger en local le texte de la page.

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import requests
import sys

def telecharge_url(url):
    """
    Télécharge une page distante avec la bibliothèque requests
    et renvoie le contenu au format texte
    https://www.w3schools.com/python/module_requests.asp
    """
    # Wikipedia demande un User Agent
    headers = {"User-Agent": "Mozilla/5.0"}
    html = requests.get(url,headers=headers)
    # print(f"Contenu de la page \n:{html}")
    return html

def main():
    # Récupération des données
    # Liste des maladies génétiques avec un gène identifié
    lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
    page = telecharge_url(lien)

if __name__ == "__main__":
    main()

Version 2 : analyser le code HTML avec BeautifulSoup

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import requests
import sys

def telecharge_url(url):
    """
    Télécharge une page distante avec la bibliothèque requests
    et renvoie le contenu au format texte
    https://www.w3schools.com/python/module_requests.asp
    """
    # Wikipedia demande un User Agent
    headers = {"User-Agent": "Mozilla/5.0"}
    html = requests.get(url,headers=headers).text
    # print(f"Contenu de la page \n:{html}")
    return html

def analyse_page(page):
    """
    Analyse le contenu d'une page web pour récupérer
    ce qui correspond à une balise spécifique 

    Renvoie une liste à partir du tableau de données

    Documentation : thunderbit.com/fr/blog/beautifulsoup-in-python

    """
    data=[]
    # Analyser la page avec beautifulsoup
    soup = BeautifulSoup(page, 'html.parser')

    # Récupérer tous les tableaux
    tables = soup.find_all('table')
    
    # Extraire les données de chaque tableau
    for t in tables:
        # Lire chaque ligne trouvée
        for ligne in t.find_all('tr'):
            # Lire chaque cellule de la ligne
            cellules = ligne.find_all('td')
            # Transformer la ligne de cellules en liste
            l = [c.text.strip() for c in cellules]
            try:
                if l[5] != '' and l[0] != 'Nom':
                    data.append(l)
            except:
                # The table has no disease data
                pass
    return data

def main():
    # Récupération des données
    # Liste des maladies génétiques avec un gène identifié
    lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
    page = telecharge_url(lien)
    liste = analyse_page(page)
    print(liste)

if __name__ == "__main__":
    main()

Version 3 : exporter le résultat dans un fichier Microsoft Excel

La libraire PANDAS permet d’exporter des données dans un fichier excel. Pour manipuler les données, elle représente celles-ci sous une forme de feuille de calcul (DataFrame), ce qui permet d’accéder rapidement à de nombreuses fonctions, comme l’export de fichier au format excel.

#!/usr/bin/env python3

from bs4 import BeautifulSoup
import pandas as pd
import requests
import sys

def telecharge_url(url):
    """
    Télécharge une page distante avec la bibliothèque requests
    et renvoie le contenu au format texte
    https://www.w3schools.com/python/module_requests.asp
    """
    # Wikipedia demande un User Agent
    headers = {"User-Agent": "Mozilla/5.0"}
    html = requests.get(url,headers=headers).text
    # print(f"Contenu de la page \n:{html}")
    return html

def analyse_page(page):
    """
    Analyse le contenu d'une page web pour récupérer
    ce qui correspond à une balise spécifique 

    Renvoie une liste à partir du tableau de données

    Documentation : thunderbit.com/fr/blog/beautifulsoup-in-python

    """
    data=[]
    # Analyser la page avec beautifulsoup
    soup = BeautifulSoup(page, 'html.parser')

    # Récupérer tous les tableaux
    tables = soup.find_all('table')
    
    # Extraire les données de chaque tableau
    for t in tables:
        # Lire chaque ligne trouvée
        for ligne in t.find_all('tr'):
            # Lire chaque cellule de la ligne
            cellules = ligne.find_all('td')
            # Transformer la ligne de cellules en liste
            l = [c.text.strip() for c in cellules]
            try:
                if l[5] != '' and l[0] != 'Nom':
                    data.append(l)
            except:
                # The table has no disease data
                pass
    return data

def main():
    # Récupération des données
    # Liste des maladies génétiques avec un gène identifié
    lien = "https://fr.wikipedia.org/wiki/Liste_des_maladies_g%C3%A9n%C3%A9tiques_%C3%A0_g%C3%A8ne_identifi%C3%A9"
    page = telecharge_url(lien)
    liste = analyse_page(page)
    
    # Export en fichier formaté
    df = pd.DataFrame(liste, columns=['Nom', 'OMIM', 
        'Transmission', 'Chromosome', 'Type de mutation', 
        'Gène en cause'])

    # Enregistrement au format Microsoft Excel
    df.to_excel("liste_maladies_genes_identifies.xlsx", index=False)

if __name__ == "__main__":
    main()

Dépendances et utilisation du programme V3

Le programme (v3) ci-dessous fait appel à requests, beautifulsoup, pandas, openpyxl (pour l’export python). Si vous utiliser un IDE comme PyCharm vous pouvez les installer via celui-ci, sinon vous pouvez créer un environnement virtuel léger python comme suit :

sudo apt install python3-virtualenv
ou sous Mac OS : brew install virtualenv

virtualenv -p python3 venv
source venv/bin/activate
pip install beautifulsoup4 pandas openpyxl requests

Pour utiliser le programme ci-dessus, vous pouvez l’exécuter via PyCharm ou via le terminal :

source venv/bin/activate
chmod +x programme_v3.py
./programme_v3.py

Le fichier excel "liste_maladies_genes_identifies.xlsx" sera créé au même endroit que le programme, et vous pouvez ouvrir ce fichier pour étudier son contenu, effectuer des tris, etc.

Pour aller plus loin

Un message, un commentaire ?

Forum sur abonnement

Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.