edb-noumea 0.2.15__tar.gz → 0.3.1__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.2.15 → edb_noumea-0.3.1}/PKG-INFO +3 -4
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/README.md +6 -2
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea/details.py +33 -17
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea.egg-info/PKG-INFO +3 -4
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea.egg-info/requires.txt +1 -2
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea.egg-info/top_level.txt +1 -0
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/pyproject.toml +5 -4
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea/__init__.py +0 -0
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea/main.py +0 -0
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea.egg-info/SOURCES.txt +0 -0
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/edb_noumea.egg-info/dependency_links.txt +0 -0
- {edb_noumea-0.2.15 → edb_noumea-0.3.1}/setup.cfg +0 -0
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edb-noumea
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.3.1
|
|
4
|
+
Summary: Scraper robuste pour la qualité des eaux de baignade à Nouméa. Ajout export CSV automatique et détection améliorée des colonnes PDF.
|
|
5
5
|
Project-URL: Homepage, https://github.com/adriens/edb-noumea
|
|
6
6
|
Project-URL: Repository, https://github.com/adriens/edb-noumea
|
|
7
7
|
Requires-Dist: requests
|
|
8
8
|
Requires-Dist: beautifulsoup4
|
|
9
9
|
Requires-Dist: pandas
|
|
10
10
|
Requires-Dist: lxml
|
|
11
|
-
Requires-Dist:
|
|
12
|
-
Requires-Dist: jpype1
|
|
11
|
+
Requires-Dist: pdfplumber
|
|
13
12
|
Requires-Dist: matplotlib
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-

|
|
1
|
+
[](https://docs.astral.sh/uv/)
|
|
2
2
|
[](https://pypistats.org/packages/edb-noumea)
|
|
3
|
-
|
|
3
|
+
[](https://www.kaggle.com/code/adriensales/qualit-eaux-de-baignade-noum-a)
|
|
4
|
+
[](https://www.kaggle.com/datasets/adriensales/qualit-des-eaux-de-baignade-nouma)
|
|
5
|
+
[](https://github.com/adriens/edb-noumea-data)
|
|
6
|
+
[](https://github.com/adriens/edb-noumea-tui)
|
|
7
|
+
[](https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade)
|
|
4
8
|
|
|
5
9
|
|
|
6
10
|
|
|
@@ -21,10 +21,10 @@ def get_pdf_url():
|
|
|
21
21
|
return get_latest_pdf_url()
|
|
22
22
|
|
|
23
23
|
import pandas as pd
|
|
24
|
-
import tabula
|
|
25
24
|
import requests
|
|
26
25
|
import io
|
|
27
26
|
from bs4 import BeautifulSoup
|
|
27
|
+
import pdfplumber
|
|
28
28
|
|
|
29
29
|
# URL de la page officielle contenant le lien vers le PDF
|
|
30
30
|
PAGE_URL = "https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade"
|
|
@@ -76,11 +76,12 @@ def get_detailed_results():
|
|
|
76
76
|
pdf_file = io.BytesIO(response.content)
|
|
77
77
|
|
|
78
78
|
try:
|
|
79
|
-
print("🔍 Extraction des tableaux du PDF...")
|
|
80
|
-
|
|
79
|
+
print("🔍 Extraction des tableaux du PDF avec pdfplumber...")
|
|
80
|
+
with pdfplumber.open(pdf_file) as pdf:
|
|
81
|
+
first_page = pdf.pages[0]
|
|
82
|
+
tables = first_page.extract_tables()
|
|
81
83
|
except Exception as e:
|
|
82
|
-
print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF.")
|
|
83
|
-
print("ℹ️ Cela peut être dû à l'absence de Java sur votre système, qui est requis par la bibliothèque 'tabula-py'.")
|
|
84
|
+
print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF avec pdfplumber.")
|
|
84
85
|
print(f" Erreur originale : {e}")
|
|
85
86
|
return None
|
|
86
87
|
|
|
@@ -88,31 +89,43 @@ def get_detailed_results():
|
|
|
88
89
|
print("❌ Aucun tableau n'a été trouvé dans le PDF.")
|
|
89
90
|
return None
|
|
90
91
|
|
|
92
|
+
# Assuming the first table is the one we want
|
|
93
|
+
df = pd.DataFrame(tables[0][1:], columns=tables[0][0])
|
|
94
|
+
|
|
91
95
|
print(f"✅ {len(tables)} tableau(x) trouvé(s). Affichage du premier.")
|
|
92
|
-
df = tables[0]
|
|
93
96
|
print("\n--- Aperçu du tableau extrait (toutes colonnes) ---")
|
|
94
97
|
with pd.option_context('display.max_columns', None):
|
|
95
98
|
print(df)
|
|
96
99
|
print("\nColonnes:", list(df.columns))
|
|
97
100
|
print("Shape:", df.shape)
|
|
98
101
|
|
|
99
|
-
#
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
entero_col = next((col for col in df.columns if "Entérocoques" in str(col)), None)
|
|
102
|
+
# Nettoyer les noms de colonnes pour faciliter la recherche
|
|
103
|
+
def clean_col(col):
|
|
104
|
+
return str(col).replace("Unnamed:", "").replace("_", " ").replace("\xa0", " ").replace("\n", " ").replace("duprélèvement", "du prélèvement").strip().lower()
|
|
103
105
|
|
|
104
|
-
|
|
105
|
-
site_col = next((col for col in df.columns if "Nom du site" in str(col)), None)
|
|
106
|
-
point_prelevement_col = next((col for col in df.columns if "Point de prélèvement" in str(col)), None)
|
|
107
|
-
date_col = next((col for col in df.columns if "Date du prélèvement" in str(col)), None)
|
|
108
|
-
heure_col = next((col for col in df.columns if "Heure du prélèvement" in str(col)), None)
|
|
106
|
+
cleaned_columns = {clean_col(col): col for col in df.columns if not str(col).startswith("Unnamed")}
|
|
109
107
|
|
|
110
|
-
|
|
108
|
+
def find_col(possibles):
|
|
109
|
+
for key, col in cleaned_columns.items():
|
|
110
|
+
for possible in possibles:
|
|
111
|
+
if possible in key:
|
|
112
|
+
return col
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
site_col = find_col(["nom du site"])
|
|
116
|
+
point_prelevement_col = find_col(["point de prélèvement"])
|
|
117
|
+
date_col = find_col(["date du prélèvement"])
|
|
118
|
+
heure_col = find_col(["heure du prélèvement", "heure"])
|
|
119
|
+
e_coli_col = find_col(["escherichia", "coli"])
|
|
120
|
+
entero_col = find_col(["entérocoques"])
|
|
121
|
+
|
|
122
|
+
# Vérification des colonnes requises
|
|
111
123
|
if not all([site_col, point_prelevement_col, date_col, heure_col, e_coli_col, entero_col]):
|
|
112
124
|
print(f"❌ Certaines colonnes requises n'ont pas été trouvées. Colonnes disponibles : {list(df.columns)}")
|
|
125
|
+
print(f"Colonnes nettoyées : {list(cleaned_columns.keys())}")
|
|
113
126
|
return None
|
|
114
127
|
|
|
115
|
-
#
|
|
128
|
+
# Sélection et renommage
|
|
116
129
|
cleaned_df = df.loc[:, [site_col, point_prelevement_col, date_col, heure_col, e_coli_col, entero_col]].copy()
|
|
117
130
|
cleaned_df.columns = [
|
|
118
131
|
"site",
|
|
@@ -161,3 +174,6 @@ if __name__ == "__main__":
|
|
|
161
174
|
"e_coli_npp_100ml",
|
|
162
175
|
"enterocoques_npp_100ml"
|
|
163
176
|
]])
|
|
177
|
+
# Export CSV avec toutes les colonnes
|
|
178
|
+
detailed_df.to_csv("details_dernier_releve_full.csv", index=False)
|
|
179
|
+
print("\n✅ Export CSV : details_dernier_releve_full.csv")
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: edb-noumea
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.3.1
|
|
4
|
+
Summary: Scraper robuste pour la qualité des eaux de baignade à Nouméa. Ajout export CSV automatique et détection améliorée des colonnes PDF.
|
|
5
5
|
Project-URL: Homepage, https://github.com/adriens/edb-noumea
|
|
6
6
|
Project-URL: Repository, https://github.com/adriens/edb-noumea
|
|
7
7
|
Requires-Dist: requests
|
|
8
8
|
Requires-Dist: beautifulsoup4
|
|
9
9
|
Requires-Dist: pandas
|
|
10
10
|
Requires-Dist: lxml
|
|
11
|
-
Requires-Dist:
|
|
12
|
-
Requires-Dist: jpype1
|
|
11
|
+
Requires-Dist: pdfplumber
|
|
13
12
|
Requires-Dist: matplotlib
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "edb-noumea"
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
description = "Scraper robuste pour la qualité des eaux de baignade à Nouméa. Ajout export CSV automatique et détection améliorée des colonnes PDF."
|
|
4
|
+
version = "0.3.1"
|
|
5
5
|
dependencies = [
|
|
6
6
|
"requests",
|
|
7
7
|
"beautifulsoup4",
|
|
8
8
|
"pandas",
|
|
9
9
|
"lxml",
|
|
10
|
-
"
|
|
11
|
-
|
|
10
|
+
"pdfplumber",
|
|
11
|
+
|
|
12
|
+
|
|
12
13
|
"matplotlib",
|
|
13
14
|
]
|
|
14
15
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|