edb-noumea 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edb-noumea
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
5
5
  Requires-Dist: requests
6
6
  Requires-Dist: beautifulsoup4
@@ -1,34 +1,61 @@
1
+
1
2
  import pandas as pd
2
3
  import tabula
3
4
  import requests
4
5
  import io
6
+ from bs4 import BeautifulSoup
7
+
8
+ # URL de la page officielle contenant le lien vers le PDF
9
+ PAGE_URL = "https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade"
5
10
 
6
- # URL du fichier PDF contenant les résultats détaillés
7
- PDF_URL = "https://www.noumea.nc/sites/default/files/noumea-pratique-salubrite-publique-resultats/2025/250905-resultats-surveillance-ebm.pdf"
11
+
12
+ def get_latest_pdf_url():
13
+ """
14
+ Récupère dynamiquement l'URL du dernier PDF d'analyses détaillées depuis la page officielle.
15
+ """
16
+ print(f"🔗 Recherche du lien PDF sur {PAGE_URL} ...")
17
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
18
+ try:
19
+ resp = requests.get(PAGE_URL, headers=headers)
20
+ resp.raise_for_status()
21
+ except Exception as e:
22
+ print(f"❌ Impossible de récupérer la page officielle : {e}")
23
+ return None
24
+ soup = BeautifulSoup(resp.text, "lxml")
25
+ # Chercher le premier lien PDF dans la page
26
+ link = soup.find("a", href=lambda h: h and h.endswith(".pdf"))
27
+ if not link:
28
+ print("❌ Aucun lien PDF trouvé sur la page.")
29
+ return None
30
+ pdf_url = link["href"]
31
+ # Si le lien est relatif, le rendre absolu
32
+ if pdf_url.startswith("/"):
33
+ pdf_url = "https://www.noumea.nc" + pdf_url
34
+ print(f"✅ Lien PDF trouvé : {pdf_url}")
35
+ return pdf_url
8
36
 
9
37
  def get_detailed_results():
10
38
  """
11
- Télécharge le PDF des résultats détaillés, en extrait le premier tableau
39
+ Télécharge dynamiquement le PDF des résultats détaillés, en extrait le premier tableau
12
40
  et le retourne sous forme de DataFrame pandas.
13
41
  """
14
- print(f"📥 Téléchargement du PDF depuis {PDF_URL}...")
42
+ pdf_url = get_latest_pdf_url()
43
+ if not pdf_url:
44
+ return None
45
+ print(f"📥 Téléchargement du PDF depuis {pdf_url} ...")
15
46
  try:
16
- # Effectuer la requête HTTP pour obtenir le contenu du PDF
17
47
  headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
18
- response = requests.get(PDF_URL, headers=headers)
48
+ response = requests.get(pdf_url, headers=headers)
19
49
  response.raise_for_status()
20
50
  print("✅ Téléchargement terminé.")
21
51
  except requests.exceptions.RequestException as e:
22
52
  print(f"❌ Erreur lors du téléchargement du fichier PDF : {e}")
23
53
  return None
24
54
 
25
- # Utiliser un buffer en mémoire pour éviter de sauvegarder le fichier sur le disque
26
55
  pdf_file = io.BytesIO(response.content)
27
56
 
28
57
  try:
29
58
  print("🔍 Extraction des tableaux du PDF...")
30
- # Extraire tous les tableaux de la première page du PDF
31
- # L'option pages='1' est importante pour ne pas scanner tout le document
32
59
  tables = tabula.read_pdf(pdf_file, pages='1', stream=True)
33
60
  except Exception as e:
34
61
  print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF.")
@@ -36,19 +63,14 @@ def get_detailed_results():
36
63
  print(f" Erreur originale : {e}")
37
64
  return None
38
65
 
39
-
40
66
  if not tables:
41
67
  print("❌ Aucun tableau n'a été trouvé dans le PDF.")
42
68
  return None
43
69
 
44
70
  print(f"✅ {len(tables)} tableau(x) trouvé(s). Affichage du premier.")
45
-
46
- # Le premier tableau est notre cible
47
71
  df = tables[0]
48
72
 
49
73
  # --- Nettoyage du DataFrame ---
50
-
51
- # 1. Définir les noms de colonnes attendus en snake_case.
52
74
  columns_to_keep = {
53
75
  df.columns[0]: "site",
54
76
  df.columns[1]: "point_de_prelevement",
@@ -57,23 +79,12 @@ def get_detailed_results():
57
79
  df.columns[6]: "e_coli_npp_100ml",
58
80
  df.columns[9]: "enterocoques_npp_100ml"
59
81
  }
60
-
61
- # 2. Sélectionner uniquement ces colonnes et en faire une copie
62
82
  cleaned_df = df[columns_to_keep.keys()].copy()
63
-
64
- # 3. Renommer les colonnes
65
83
  cleaned_df.rename(columns=columns_to_keep, inplace=True)
66
-
67
- # 4. Remplacer les valeurs non numériques et convertir en type numérique
68
84
  cleaned_df.replace({'<10': 0}, inplace=True)
69
-
70
- # Convertir les colonnes en numérique, les erreurs deviendront NaN (non-numérique)
71
85
  cleaned_df['e_coli_npp_100ml'] = pd.to_numeric(cleaned_df['e_coli_npp_100ml'], errors='coerce')
72
86
  cleaned_df['enterocoques_npp_100ml'] = pd.to_numeric(cleaned_df['enterocoques_npp_100ml'], errors='coerce')
73
-
74
- # Remplir les éventuelles valeurs NaN qui auraient pu être créées
75
87
  cleaned_df.fillna(0, inplace=True)
76
-
77
88
  return cleaned_df
78
89
 
79
90
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edb-noumea
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
5
5
  Requires-Dist: requests
6
6
  Requires-Dist: beautifulsoup4
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "edb-noumea"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  description = "Un scraper pour la qualité des eaux de baignade à Nouméa."
5
5
  dependencies = [
6
6
  "requests",
File without changes
File without changes