edb-noumea 0.1.0__py3-none-any.whl

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.
edb_noumea/__init__.py ADDED
@@ -0,0 +1 @@
1
+ # This file makes the 'scraper' directory a Python package.
edb_noumea/details.py ADDED
@@ -0,0 +1,86 @@
1
+ import pandas as pd
2
+ import tabula
3
+ import requests
4
+ import io
5
+
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"
8
+
9
+ def get_detailed_results():
10
+ """
11
+ Télécharge le PDF des résultats détaillés, en extrait le premier tableau
12
+ et le retourne sous forme de DataFrame pandas.
13
+ """
14
+ print(f"📥 Téléchargement du PDF depuis {PDF_URL}...")
15
+ try:
16
+ # Effectuer la requête HTTP pour obtenir le contenu du PDF
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
+ response = requests.get(PDF_URL, headers=headers)
19
+ response.raise_for_status()
20
+ print("✅ Téléchargement terminé.")
21
+ except requests.exceptions.RequestException as e:
22
+ print(f"❌ Erreur lors du téléchargement du fichier PDF : {e}")
23
+ return None
24
+
25
+ # Utiliser un buffer en mémoire pour éviter de sauvegarder le fichier sur le disque
26
+ pdf_file = io.BytesIO(response.content)
27
+
28
+ try:
29
+ 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
+ tables = tabula.read_pdf(pdf_file, pages='1', stream=True)
33
+ except Exception as e:
34
+ print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF.")
35
+ print("ℹ️ Cela peut être dû à l'absence de Java sur votre système, qui est requis par la bibliothèque 'tabula-py'.")
36
+ print(f" Erreur originale : {e}")
37
+ return None
38
+
39
+
40
+ if not tables:
41
+ print("❌ Aucun tableau n'a été trouvé dans le PDF.")
42
+ return None
43
+
44
+ print(f"✅ {len(tables)} tableau(x) trouvé(s). Affichage du premier.")
45
+
46
+ # Le premier tableau est notre cible
47
+ df = tables[0]
48
+
49
+ # --- Nettoyage du DataFrame ---
50
+
51
+ # 1. Définir les noms de colonnes attendus en snake_case.
52
+ columns_to_keep = {
53
+ df.columns[0]: "site",
54
+ df.columns[1]: "point_de_prelevement",
55
+ df.columns[2]: "date",
56
+ df.columns[4]: "heure",
57
+ df.columns[6]: "e_coli_npp_100ml",
58
+ df.columns[9]: "enterocoques_npp_100ml"
59
+ }
60
+
61
+ # 2. Sélectionner uniquement ces colonnes et en faire une copie
62
+ cleaned_df = df[columns_to_keep.keys()].copy()
63
+
64
+ # 3. Renommer les colonnes
65
+ 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
+ cleaned_df.replace({'<10': 0}, inplace=True)
69
+
70
+ # Convertir les colonnes en numérique, les erreurs deviendront NaN (non-numérique)
71
+ cleaned_df['e_coli_npp_100ml'] = pd.to_numeric(cleaned_df['e_coli_npp_100ml'], errors='coerce')
72
+ 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
+ cleaned_df.fillna(0, inplace=True)
76
+
77
+ return cleaned_df
78
+
79
+ if __name__ == "__main__":
80
+ # Obtenir le DataFrame des résultats détaillés
81
+ detailed_df = get_detailed_results()
82
+
83
+ # Afficher le DataFrame s'il a été créé avec succès
84
+ if detailed_df is not None:
85
+ print("\n📋 Voici les détails des derniers relevés :")
86
+ print(detailed_df.to_string())
edb_noumea/main.py ADDED
@@ -0,0 +1,54 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+ # URL de la page à scraper
5
+ URL = "https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade"
6
+
7
+ def get_water_quality():
8
+ """
9
+ Récupère les données sur la qualité de l'eau de baignade depuis le site de la ville de Nouméa
10
+ et les retourne dans un DataFrame pandas en lisant directement les tables HTML.
11
+ """
12
+ try:
13
+ # Effectuer la requête HTTP pour obtenir le contenu de la page
14
+ # Ajouter un header User-Agent pour simuler un navigateur
15
+ 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'}
16
+ response = requests.get(URL, headers=headers)
17
+ # Lancer une exception si la requête a échoué
18
+ response.raise_for_status()
19
+ except requests.exceptions.RequestException as e:
20
+ print(f"Erreur lors de la requête HTTP : {e}")
21
+ return None
22
+
23
+ try:
24
+ # pandas.read_html retourne une liste de tous les DataFrames trouvés dans le HTML
25
+ tables = pd.read_html(response.content, flavor='lxml')
26
+ except ValueError:
27
+ print("Aucune table n'a été trouvée sur la page.")
28
+ return None
29
+
30
+ if not tables:
31
+ print("Aucune table n'a été trouvée sur la page.")
32
+ return None
33
+
34
+ # En supposant que le tableau que nous voulons est le premier trouvé
35
+ df = tables[0]
36
+
37
+ # Renommer les colonnes pour qu'elles soient plus claires
38
+ # Nous nous attendons à deux colonnes : Plage et État
39
+ if df.shape[1] == 2:
40
+ df.columns = ["plage", "etat_sanitaire"]
41
+ else:
42
+ print(f"La table trouvée n'a pas le format attendu (2 colonnes). Colonnes trouvées : {df.shape[1]}")
43
+ return None
44
+
45
+ return df
46
+
47
+ if __name__ == "__main__":
48
+ # Appeler la fonction pour obtenir le DataFrame
49
+ water_quality_df = get_water_quality()
50
+
51
+ # Afficher le DataFrame s'il a été créé avec succès
52
+ if water_quality_df is not None:
53
+ print("📊 État sanitaire des eaux de baignade à Nouméa 📊")
54
+ print(water_quality_df.to_string())
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: edb-noumea
3
+ Version: 0.1.0
4
+ Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
5
+ Requires-Dist: requests
6
+ Requires-Dist: beautifulsoup4
7
+ Requires-Dist: pandas
8
+ Requires-Dist: lxml
9
+ Requires-Dist: tabula-py
10
+ Requires-Dist: matplotlib
@@ -0,0 +1,7 @@
1
+ edb_noumea/__init__.py,sha256=G7WKTGLsr2wtW1E2jYpqq4miZLoSGhTifSE36CGNkLo,60
2
+ edb_noumea/details.py,sha256=BWxteQQRV8v-YbfhR-xTJFT0ZicRi1k6wWnfycmuBlE,3477
3
+ edb_noumea/main.py,sha256=KWT0ZGrHlbhEsQxi_Rw0Mm1syDIxoY-Px1yab94IbJc,2115
4
+ edb_noumea-0.1.0.dist-info/METADATA,sha256=imfXySNTCRsMj6nPN0dF1U8GRCGCTA7aX3Qmm6jxakM,271
5
+ edb_noumea-0.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
+ edb_noumea-0.1.0.dist-info/top_level.txt,sha256=Dj3JusM0b5H9_f9yZeO-IwucCZzI1OHSjLMKtvRjq6k,11
7
+ edb_noumea-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ edb_noumea