Umsatzsuche + Mitarbeitersuche + Debug Mode

Umsatz‑Extraktion:

Die Regex zur Erfassung der Zahl wurde leicht vereinfacht, sodass nun zunächst alle Ziffern und die Zeichen „,.“ erfasst werden.

Falls ein Komma vorhanden ist, werden Punkte als Tausendertrennzeichen entfernt und das Komma als Dezimaltrenner verwendet; falls nicht, werden alle Punkte (und Leerzeichen) entfernt.

Anschließend wird geprüft, ob im Text Hinweise wie „mrd“ oder „mio“ vorkommen, um den Wert korrekt in Mio € umzurechnen.

Mitarbeiter‑Extraktion:

Wenn der Text in der Zelle „Mitarbeiterzahl“ enthält, wird dieser Teil abgespalten und danach mittels Regex das erste Zahlenfragment erfasst.

Re‑Evaluierungsmodus:

Der Modus „2“ verarbeitet alle Zeilen, in denen in Spalte A ein „x“ steht und ignoriert die Abfrage der Zeilenzahl (das kannst du aber optional beibehalten, falls gewünscht).
This commit is contained in:
2025-04-01 03:18:39 +00:00
parent 836bae0e8b
commit 639306efa2

View File

@@ -12,7 +12,7 @@ import csv
# ==================== KONFIGURATION ==================== # ==================== KONFIGURATION ====================
class Config: class Config:
VERSION = "1.1.6" # Neue Version nach Modus-Erweiterung VERSION = "1.1.7" # Neue Version
LANG = "de" LANG = "de"
CREDENTIALS_FILE = "service_account.json" CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -81,10 +81,9 @@ class GoogleSheetHandler:
self.sheet = gspread.authorize(creds).open_by_url(Config.SHEET_URL).sheet1 self.sheet = gspread.authorize(creds).open_by_url(Config.SHEET_URL).sheet1
self.sheet_values = self.sheet.get_all_values() self.sheet_values = self.sheet.get_all_values()
def get_start_index(self): def get_start_index(self):
# Hier wird Spalte N (Index 14) wie bisher verwendet.
filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]] filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]]
return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1) return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1)
# Update-Aufrufe erfolgen separat für verschiedene Spalten. # Update-Aufrufe erfolgen separat.
# ==================== WIKIPEDIA SCRAPER ==================== # ==================== WIKIPEDIA SCRAPER ====================
class WikipediaScraper: class WikipediaScraper:
@@ -162,7 +161,7 @@ class WikipediaScraper:
keywords_map = { keywords_map = {
'branche': ['branche', 'industrie', 'tätigkeit', 'geschäftsfeld', 'sektor', 'produkte', 'leistungen', 'aktivitäten', 'wirtschaftszweig'], 'branche': ['branche', 'industrie', 'tätigkeit', 'geschäftsfeld', 'sektor', 'produkte', 'leistungen', 'aktivitäten', 'wirtschaftszweig'],
'umsatz': ['umsatz', 'jahresumsatz', 'konzernumsatz', 'gesamtumsatz', 'erlöse', 'umsatzerlöse', 'einnahmen', 'ergebnis', 'jahresergebnis'], 'umsatz': ['umsatz', 'jahresumsatz', 'konzernumsatz', 'gesamtumsatz', 'erlöse', 'umsatzerlöse', 'einnahmen', 'ergebnis', 'jahresergebnis'],
'mitarbeiter': ['mitarbeiter', 'beschäftigte', 'personal', 'mitarbeiterzahl'] 'mitarbeiter': ['mitarbeiter', 'beschäftigte', 'personal', 'mitarbeiterzahl', 'angestellte', 'belegschaft', 'personalstärke']
} }
keywords = keywords_map.get(target, []) keywords = keywords_map.get(target, [])
for row in infobox.find_all('tr'): for row in infobox.find_all('tr'):
@@ -178,13 +177,13 @@ class WikipediaScraper:
return ' '.join(clean_val.split()).strip() return ' '.join(clean_val.split()).strip()
if target == 'umsatz': if target == 'umsatz':
raw = raw_value.lower() raw = raw_value.lower()
match = re.search(r'(\d{1,3}(?:[.,]\d{3})*|\d+)', raw) match = re.search(r'([\d.,]+)', raw)
if match: if match:
num_str = match.group(1) num_str = match.group(1)
if ',' in num_str: if ',' in num_str:
num_str = num_str.replace('.', '').replace(',', '.') num_str = num_str.replace('.', '').replace(',', '.')
else: else:
num_str = num_str.replace('.', '') num_str = num_str.replace(' ', '').replace('.', '')
try: try:
num = float(num_str) num = float(num_str)
except Exception as e: except Exception as e:
@@ -200,6 +199,9 @@ class WikipediaScraper:
return raw_value.strip() return raw_value.strip()
if target == 'mitarbeiter': if target == 'mitarbeiter':
raw = raw_value.lower() raw = raw_value.lower()
# Falls "mitarbeiterzahl" explizit vorkommt, entferne diesen Teil
if "mitarbeiterzahl" in raw:
raw = raw.split("mitarbeiterzahl")[-1]
numbers = re.findall(r'\d+', raw) numbers = re.findall(r'\d+', raw)
if numbers: if numbers:
return numbers[0] return numbers[0]
@@ -268,20 +270,27 @@ class DataProcessor:
def __init__(self): def __init__(self):
self.sheet_handler = GoogleSheetHandler() self.sheet_handler = GoogleSheetHandler()
self.wiki_scraper = WikipediaScraper() self.wiki_scraper = WikipediaScraper()
def process_rows(self, num_rows): def process_rows(self, num_rows=None):
start_index = self.sheet_handler.get_start_index() # Im Re-Evaluierungsmodus wird num_rows ignoriert.
print(f"Starte bei Zeile {start_index+1}") if MODE == "2":
for i in range(start_index, min(start_index + num_rows, len(self.sheet_handler.sheet_values))): print("Re-Evaluierungsmodus: Verarbeitung aller Zeilen mit 'x' in Spalte A.")
row = self.sheet_handler.sheet_values[i] else:
self._process_single_row(i+1, row) start_index = self.sheet_handler.get_start_index()
print(f"Starte bei Zeile {start_index+1}")
for i, row in enumerate(self.sheet_handler.sheet_values[1:], start=2):
if MODE == "2":
# Nur Zeilen mit "x" in Spalte A verarbeiten
if row[0].strip().lower() == "x":
self._process_single_row(i, row)
else:
# Normalmodus: Alle Zeilen ab Startindex verarbeiten
if i >= self.sheet_handler.get_start_index():
self._process_single_row(i, row)
def _process_single_row(self, row_num, row_data): def _process_single_row(self, row_num, row_data):
# Modusabhängige Verarbeitung: # Modusabhängige Verarbeitung:
# Normalmodus (Modus "1"): Firmenname in Spalte A, Website in Spalte B; Ausgabe in G:K, Datum in N, Version in Q. # Normalmodus (Modus "1"): Firmenname in Spalte A, Website in Spalte B; Ausgabe in G:K, Datum in N, Version in Q.
# Re-Evaluierungsmodus (Modus "2"): Nur Zeilen mit "x" in Spalte A; Firmenname in Spalte B, Website in Spalte C; Ausgabe in H:L, Datum in O, Version in R. # Re-Evaluierungsmodus (Modus "2"): Nur Zeilen mit "x" in Spalte A; Firmenname in Spalte B, Website in Spalte C; Ausgabe in H:L, Datum in O, Version in R.
if MODE == "2": if MODE == "2":
if not row_data[0].strip().lower() == "x":
print(f"[{datetime.now().strftime('%H:%M:%S')}] Überspringe Zeile {row_num}, kein 'x' in Spalte A.")
return
company_name = row_data[1] if len(row_data) > 1 else "" company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else "" website = row_data[2] if len(row_data) > 2 else ""
update_range = f"H{row_num}:L{row_num}" update_range = f"H{row_num}:L{row_num}"
@@ -316,11 +325,14 @@ class DataProcessor:
if __name__ == "__main__": if __name__ == "__main__":
mode_input = input("Wählen Sie den Modus: 1 für normalen Modus, 2 für Re-Evaluierungsmodus: ").strip() mode_input = input("Wählen Sie den Modus: 1 für normalen Modus, 2 für Re-Evaluierungsmodus: ").strip()
MODE = "2" if mode_input == "2" else "1" MODE = "2" if mode_input == "2" else "1"
try: if MODE == "1":
num_rows = int(input("Wieviele Zeilen sollen überprüft werden? ")) try:
except Exception as e: num_rows = int(input("Wieviele Zeilen sollen überprüft werden? "))
print("Ungültige Eingabe. Bitte eine Zahl eingeben.") except Exception as e:
exit(1) print("Ungültige Eingabe. Bitte eine Zahl eingeben.")
exit(1)
else:
num_rows = None # Im Re-Evaluierungsmodus werden alle markierten Zeilen verarbeitet.
processor = DataProcessor() processor = DataProcessor()
processor.process_rows(num_rows) processor.process_rows(num_rows)
print("\n✅ Wikipedia-Auswertung abgeschlossen") print("\n✅ Wikipedia-Auswertung abgeschlossen")