Vous avez trouvé le dataset parfait sur un site web. Maintenant vous en avez besoin dans Pandas.
L'approche traditionnelle :
import pandas as pd
# En espérant que la structure du site soit simple
tables = pd.read_html('https://example.com/data')
# Deviner quel tableau vous voulez
df = tables[0] # Peut-être ? Voyons voir...
# Découvrir les problèmes
print(df.dtypes)
# Tout est 'object' (string)
# Les nombres ont des virgules
# Les dates sont illisibles
# Les noms de colonnes ont des espaces
# Passer 30 minutes à nettoyer...
Laissez-moi vous montrer un moyen plus rapide.
Le Problème avec pd.read_html()
La fonction read_html() de Pandas est pratique mais limitée :
Pas de sélection de tableau — Elle récupère tous les tableaux. Vous devinez quel index vous intéresse.
Pas de nettoyage — Les nombres comme « 1 234 567 » restent en chaînes de caractères.
Problèmes CORS — Beaucoup de sites bloquent l'accès programmatique.
Rendu JavaScript — Les tableaux dynamiques n'existent pas dans le HTML brut.
Authentification — Impossible d'accéder au contenu derrière une connexion.
Pour des scripts rapides, ça fonctionne. Pour de vraies analyses, il faut mieux.
Le Workflow de 30 Secondes
Voici ce que je fais vraiment :
Étape 1 : Exporter depuis le navigateur (5 secondes)
Avec HTML Table Exporter :
- Je clique sur le tableau que je veux
- Je clique sur l'icône de l'extension
- Je sélectionne le profil « Pour Pandas »
- J'exporte en CSV depuis le tableau mis en surbrillance dans l'extension
L'extension voit exactement ce que votre navigateur voit — contenu rendu en JavaScript, pages authentifiées, tout.
Étape 2 : Charger dans Pandas (5 secondes)
import pandas as pd
df = pd.read_csv('export.csv')
print(df.dtypes)
C'est tout. Les données sont déjà propres.
Ce que « Propre » Signifie Vraiment
Quand j'exporte avec le profil « Pour Pandas », l'extension gère :
Normalisation des nombres
Avant : "1.234.567,89" (format européen)
Après : 1234567.89 (float)
Avant : "1 234,56 €"
Après : 1234.56
Le CSV contient des nombres normalisés que Pandas parse correctement :
# Sans nettoyage :
df['chiffre_affaires'].sum() # TypeError: can only concatenate str
# Avec nettoyage :
df['chiffre_affaires'].sum() # 4892341.50 ✓
Conversion des booléens
Avant : "Oui", "Non", "O", "N", "Vrai", "Faux"
Après : true, false
# Le filtre fonctionne immédiatement
utilisateurs_actifs = df[df['est_actif'] == True]
Gestion des valeurs nulles
Avant : "-", "N/A", "n/a", "", "null", "—"
Après : (vide, parsé comme NaN)
# La détection des null fonctionne
df['champ_optionnel'].isna().sum() # Comptage correct
En-têtes en snake_case
Avant : "Chiffre d'Affaires (M€)", "Nombre d'Utilisateurs", "Taux de Croissance %"
Après : chiffre_affaires_m, nombre_utilisateurs, taux_de_croissance
# Accès propre aux colonnes
df['chiffre_affaires_m'] # Au lieu de df["Chiffre d'Affaires (M€)"]
Exemple Réel : Stats Football FBRef
Imaginons que je veux les statistiques des joueurs de Ligue 1 depuis FBRef.
L'Ancienne Méthode
import pandas as pd
import requests
from bs4 import BeautifulSoup
url = 'https://fbref.com/en/comps/13/stats/Ligue-1-Stats'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# Trouver le bon tableau (il y en a beaucoup)
table = soup.find('table', {'id': 'stats_standard'})
# Le parser manuellement parce que les en-têtes sont complexes
# FBRef utilise des en-têtes groupés : "Playing Time" couvre plusieurs colonnes
# Ça casse pd.read_html()
# 45 minutes plus tard...
La Nouvelle Méthode
- Ouvrir FBRef dans le navigateur
- Cliquer sur l'extension → sélectionner le tableau → exporter avec le profil « Pour Pandas »
- Charger :
df = pd.read_csv('fbref_stats.csv')
print(df.columns.tolist())
# ['player', 'nation', 'squad', 'playing_time_mp',
# 'playing_time_starts', 'performance_gls', ...]
Les en-têtes groupés (« Playing Time », « Performance ») sont fusionnés avec les sous-en-têtes automatiquement.
Le Code que Je N'Écris Plus
Voici le code de nettoyage que j'écrivais pour chaque scrape web :
def nettoyer_donnees_web(df):
"""La fonction dont je n'ai plus besoin."""
# Corriger les colonnes numériques
for col in df.select_dtypes(include='object'):
try:
# Supprimer les symboles monétaires
cleaned = df[col].str.replace(r'[$€£¥]', '', regex=True)
# Supprimer les séparateurs de milliers
cleaned = cleaned.str.replace(',', '')
# Convertir
df[col] = pd.to_numeric(cleaned, errors='ignore')
except:
pass
# Corriger les colonnes booléennes
bool_map = {
'oui': True, 'non': False,
'true': True, 'false': False,
'o': True, 'n': False,
'1': True, '0': False,
}
for col in df.columns:
if df[col].str.lower().isin(bool_map.keys()).all():
df[col] = df[col].str.lower().map(bool_map)
# Corriger les valeurs nulles
null_values = ['', '-', 'N/A', 'n/a', 'null', 'NULL', '—', '–']
df = df.replace(null_values, np.nan)
# Corriger les noms de colonnes
df.columns = (df.columns
.str.lower()
.str.replace(r'[^a-z0-9]+', '_', regex=True)
.str.strip('_'))
return df
Cette fonction tournait sur chaque dataset. Maintenant l'export s'en charge.
Quand Utiliser Quoi
| Scénario | Meilleure approche |
|---|---|
| Analyse ponctuelle | Export navigateur → CSV → Pandas |
| Scraping récurrent | Script Python avec requests
|
| Sites JavaScript | Export navigateur (voit le contenu rendu) |
| Données authentifiées | Export navigateur (utilise votre session) |
| API disponible | Utiliser l'API directement |
| Tableau statique simple |
pd.read_html() suffit |
Astuce Pro : JSON pour les données complexes
Pour des données imbriquées ou typées, exportez en JSON :
import pandas as pd
import json
with open('export.json') as f:
data = json.load(f)
df = pd.DataFrame(data)
L'export JSON préserve les types :
- Les nombres restent des nombres (pas des chaînes)
- Les booléens restent des booléens
- Les nulls restent null
print(df.dtypes)
# player object
# goals int64 # Déjà numérique !
# is_starter bool # Déjà booléen !
# injury_date object # Parsable en datetime
Pour en savoir plus sur les exports et formats disponibles, consultez Les 5 Meilleures Extensions Chrome pour Exporter des Tableaux.
Résumé du Workflow
Ancien workflow (30+ minutes) :
- Écrire un script de scraping
- Gérer les problèmes CORS/auth
- Parser du HTML complexe
- Nettoyer les nombres
- Nettoyer les booléens
- Nettoyer les nulls
- Corriger les noms de colonnes
- Débugger les cas limites
- Enfin : analyser
Nouveau workflow (30 secondes) :
- Cliquer sur l'extension
- Exporter avec un profil de nettoyage
pd.read_csv()- Analyser
Essayez
- Installez HTML Table Exporter
- Trouvez un tableau que vous voulez analyser
- Exportez avec les profils de nettoyage
- Chargez dans Pandas
La version gratuite gère les exports de base. PRO ajoute les profils de nettoyage et les exports optimisés pour Pandas.
En savoir plus sur gauchogrid.com/fr/html-table-exporter ou essayez-le sur le Chrome Web Store.
Quel est votre workflow actuel pour récupérer des données web dans Pandas ? Je suis curieux de savoir combien de temps vous passez sur l'étape de nettoyage. Laissez un commentaire ci-dessous.
Top comments (0)