Comment Trouver Tous les Liens d’une Page HTML avec Python ?

Introduction

Extraire des hyperliens depuis une page web est une tâche courante en scraping web, exploration de données et automatisation. Dans cet article, vous allez apprendre à utiliser Python pour extraire tous les hyperliens d'une page HTML — et même télécharger des fichiers (comme les .hdf) depuis la NASA en utilisant un jeton d'accès.

Qu’est-ce qu’un Hyperlien en HTML ?

Voici un exemple simple :

1
<a href="https://en.moonbooks.org">Visitez moonbooks</a>

Explication :

1
2
3
* `<a>` est la balise dancrage utilisée pour définir un lien hypertexte.
* `href` est lattribut qui contient lURL.
* Le texte à lintérieur des balises est ce sur quoi lutilisateur clique  ici : **Visitez moonbooks**.

Prérequis

Vous aurez besoin de :

  • Python 3.x
  • Des bibliothèques beautifulsoup4 et requests

Installez-les avec :

1
pip install beautifulsoup4 requests

Guide Étape par Étape

Étape 1 : Importer les bibliothèques nécessaires

1
2
import requests
from bs4 import BeautifulSoup

Étape 2 : Récupérer le contenu de la page web

1
2
3
url = 'https://example.com'
response = requests.get(url)
html_content = response.text

Utilisez response.content au lieu de response.text si vous traitez des données binaires ou non UTF-8.

Étape 3 : Analyser le HTML avec BeautifulSoup

1
soup = BeautifulSoup(html_content, 'html.parser')

Étape 4 : Extraire toutes les balises de type lien

1
2
3
4
5
6
anchor_tags = soup.find_all('a')

for tag in anchor_tags:
    href = tag.get('href')
    if href:
        print(href)

Cela affichera tous les hyperliens trouvés sur la page.

Exemple : Résoudre les URL relatives avec urljoin

Beaucoup de liens sur les sites web sont relatifs (par exemple "/page.html"). Utilisez urljoin pour les convertir en URL absolues :

1
2
3
4
5
6
7
from urllib.parse import urljoin

for tag in anchor_tags:
    href = tag.get('href')
    if href:
        full_url = urljoin(url, href)
        print(full_url)

Filtrer et Télécharger des Fichiers Spécifiques

Si vous ne souhaitez que les fichiers .pdf, .hdf, etc. :

1
2
if href.endswith('.hdf'):
    print(href)

Exemple : Accéder aux URL protégées de la NASA avec un "Token"

Pour télécharger des fichiers .hdf depuis le site ASDC (CALIPSO) de la NASA, vous devez d'abord obtenir un jeton Earthdata Login.

  1. Rendez-vous sur https://urs.earthdata.nasa.gov/ et créez un compte.
  2. Générez un Token via Applications > Generate Token.

Exemple de Code pour Lister les Fichiers .hdf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import urllib.request
from bs4 import BeautifulSoup

token = 'VOTRE_JETON_ICI'

opener = urllib.request.build_opener()
opener.addheaders = [('Authorization', f'Bearer {token}')]
urllib.request.install_opener(opener)

url = 'https://asdc.larc.nasa.gov/data/CALIPSO/LID_L2_05kmALay-Standard-V4-51/2011/01/'
html_page = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html_page, 'html.parser')

# Extraire tous les liens vers les fichiers .hdf
links = [a['href'] for a in soup.find_all('a', href=True) if a['href'].endswith('.hdf')]

for link in links:
    print(link)

Remarques :

  • build_opener() : crée un gestionnaire personnalisé d’URL.
  • addheaders : ajoute l’en-tête d’authentification à chaque requête HTTP.
  • install_opener() : définit ce gestionnaire comme valeur par défaut globale.

Sans cette configuration, vous obtiendrez une erreur 403 Forbidden.

Télécharger les fichiers

Pour ne télécharger que les fichiers .hdf, ajoutez une condition if dans la boucle :

1
2
3
4
5
6
7
8
from urllib.parse import urljoin
import urllib.request

for file_name in links:
    if file_name.endswith('.hdf'):
        full_url = urljoin(url, file_name)
        print(f"Téléchargement de {file_name}...")
        urllib.request.urlretrieve(full_url, file_name)

Explication :

  • file_name.endswith('.hdf') garantit qu'on télécharge uniquement les fichiers .hdf.
  • urljoin(url, file_name) génère l'URL complète.
  • urllib.request.urlretrieve() télécharge le fichier dans le dossier de travail actuel.

Corriger l’erreur de certificat SSL

Si vous obtenez cette erreur :

1
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

Cela signifie que votre environnement Python ne peut pas vérifier le certificat SSL du site. Voici comment corriger cela :

Option 1 : Utilitaire d'installation de certificats sur macOS

Si vous êtes sur macOS et avez installé Python depuis python.org :

1
/Applications/Python\ 3.x/Install\ Certificates.command

Option 2 : Désactiver temporairement la vérification (⚠️ Non recommandé)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url = 'https://en.moonbooks.org'
response = requests.get(url, verify=False)
soup = BeautifulSoup(response.text, 'html.parser')

links = [a['href'] for a in soup.find_all('a', href=True)]
for link in links:
    print(link)

Option 3 : Utiliser certifi pour fournir des CAs de confiance

Installation :

1
pip install certifi

Code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import requests
import certifi
from bs4 import BeautifulSoup

url = 'https://en.moonbooks.org'
response = requests.get(url, verify=certifi.where())
soup = BeautifulSoup(response.text, 'html.parser')

links = [a['href'] for a in soup.find_all('a', href=True)]
for link in links:
    print(link)

Conclusion

Avec quelques lignes de Python et les bibliothèques BeautifulSoup et requests, vous pouvez :

  • Extraire des hyperliens à partir de pages HTML
  • Filtrer et télécharger certains types de fichiers
  • Gérer l’authentification via des jetons Bearer
  • Corriger les erreurs SSL si nécessaire