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.
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edb-noumea
3
- Version: 0.2.15
4
- Summary: Un scraper pour la qualité des eaux de baignade à Nouméa. (Bug fix release: improved PDF column detection and added jpype1 dependency)
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: tabula-py
12
- Requires-Dist: jpype1
11
+ Requires-Dist: pdfplumber
13
12
  Requires-Dist: matplotlib
@@ -1,6 +1,10 @@
1
- ![Built with uv](https://img.shields.io/badge/Built%20with-uv-blueviolet?logo=python&logoColor=white)
1
+ [![Built with uv](https://img.shields.io/badge/Built%20with-uv-blueviolet?logo=python&logoColor=white)](https://docs.astral.sh/uv/)
2
2
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/edb-noumea)](https://pypistats.org/packages/edb-noumea)
3
-
3
+ [![Open in Kaggle](https://img.shields.io/badge/Kaggle-Open%20Notebook-blue?logo=kaggle)](https://www.kaggle.com/code/adriensales/qualit-eaux-de-baignade-noum-a)
4
+ [![Dataset](https://img.shields.io/badge/Kaggle-Dataset-blue?logo=kaggle)](https://www.kaggle.com/datasets/adriensales/qualit-des-eaux-de-baignade-nouma)
5
+ [![Live CSV Data](https://img.shields.io/badge/GitHub-Live%20CSV%20Data-black?logo=github)](https://github.com/adriens/edb-noumea-data)
6
+ [![Go BubbleTea TUI](https://img.shields.io/badge/Go-BubbleTea%20TUI-00ADD8?logo=go)](https://github.com/adriens/edb-noumea-tui)
7
+ [![Site officiel Ville de Nouméa](https://img.shields.io/badge/Nouméa-Site%20officiel%20Ville%20de%20Nouméa-0A74DA)](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
- tables = tabula.read_pdf(pdf_file, pages='1', stream=True)
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
- # Sélection dynamique des colonnes bactéries par nom
100
- # Recherche des colonnes contenant les mots-clés
101
- e_coli_col = next((col for col in df.columns if "Escherichia" in str(col) or "coli" in str(col)), None)
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
- # Dynamically find all required columns
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
- # Check if all required columns are found
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
- # Select and rename columns to internal consistent names
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.2.15
4
- Summary: Un scraper pour la qualité des eaux de baignade à Nouméa. (Bug fix release: improved PDF column detection and added jpype1 dependency)
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: tabula-py
12
- Requires-Dist: jpype1
11
+ Requires-Dist: pdfplumber
13
12
  Requires-Dist: matplotlib
@@ -2,6 +2,5 @@ requests
2
2
  beautifulsoup4
3
3
  pandas
4
4
  lxml
5
- tabula-py
6
- jpype1
5
+ pdfplumber
7
6
  matplotlib
@@ -1,3 +1,4 @@
1
+ build
1
2
  dist
2
3
  edb_noumea
3
4
  examples
@@ -1,14 +1,15 @@
1
1
  [project]
2
2
  name = "edb-noumea"
3
- version = "0.2.15"
4
- description = "Un scraper pour la qualité des eaux de baignade à Nouméa. (Bug fix release: improved PDF column detection and added jpype1 dependency)"
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
- "tabula-py",
11
- "jpype1",
10
+ "pdfplumber",
11
+
12
+
12
13
  "matplotlib",
13
14
  ]
14
15
 
File without changes