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.
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/PKG-INFO +1 -1
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea/details.py +36 -25
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea.egg-info/PKG-INFO +1 -1
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/pyproject.toml +1 -1
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/README.md +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea/__init__.py +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea/main.py +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea.egg-info/SOURCES.txt +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea.egg-info/dependency_links.txt +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea.egg-info/requires.txt +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/edb_noumea.egg-info/top_level.txt +0 -0
- {edb_noumea-0.1.0 → edb_noumea-0.2.0}/setup.cfg +0 -0
|
@@ -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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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(
|
|
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__":
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|