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:
@@ -12,7 +12,7 @@ import csv
|
||||
|
||||
# ==================== KONFIGURATION ====================
|
||||
class Config:
|
||||
VERSION = "1.1.6" # Neue Version nach Modus-Erweiterung
|
||||
VERSION = "1.1.7" # Neue Version
|
||||
LANG = "de"
|
||||
CREDENTIALS_FILE = "service_account.json"
|
||||
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_values = self.sheet.get_all_values()
|
||||
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:]]
|
||||
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 ====================
|
||||
class WikipediaScraper:
|
||||
@@ -162,7 +161,7 @@ class WikipediaScraper:
|
||||
keywords_map = {
|
||||
'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'],
|
||||
'mitarbeiter': ['mitarbeiter', 'beschäftigte', 'personal', 'mitarbeiterzahl']
|
||||
'mitarbeiter': ['mitarbeiter', 'beschäftigte', 'personal', 'mitarbeiterzahl', 'angestellte', 'belegschaft', 'personalstärke']
|
||||
}
|
||||
keywords = keywords_map.get(target, [])
|
||||
for row in infobox.find_all('tr'):
|
||||
@@ -178,13 +177,13 @@ class WikipediaScraper:
|
||||
return ' '.join(clean_val.split()).strip()
|
||||
if target == 'umsatz':
|
||||
raw = raw_value.lower()
|
||||
match = re.search(r'(\d{1,3}(?:[.,]\d{3})*|\d+)', raw)
|
||||
match = re.search(r'([\d.,]+)', raw)
|
||||
if match:
|
||||
num_str = match.group(1)
|
||||
if ',' in num_str:
|
||||
num_str = num_str.replace('.', '').replace(',', '.')
|
||||
else:
|
||||
num_str = num_str.replace('.', '')
|
||||
num_str = num_str.replace(' ', '').replace('.', '')
|
||||
try:
|
||||
num = float(num_str)
|
||||
except Exception as e:
|
||||
@@ -200,6 +199,9 @@ class WikipediaScraper:
|
||||
return raw_value.strip()
|
||||
if target == 'mitarbeiter':
|
||||
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)
|
||||
if numbers:
|
||||
return numbers[0]
|
||||
@@ -268,20 +270,27 @@ class DataProcessor:
|
||||
def __init__(self):
|
||||
self.sheet_handler = GoogleSheetHandler()
|
||||
self.wiki_scraper = WikipediaScraper()
|
||||
def process_rows(self, num_rows):
|
||||
start_index = self.sheet_handler.get_start_index()
|
||||
print(f"Starte bei Zeile {start_index+1}")
|
||||
for i in range(start_index, min(start_index + num_rows, len(self.sheet_handler.sheet_values))):
|
||||
row = self.sheet_handler.sheet_values[i]
|
||||
self._process_single_row(i+1, row)
|
||||
def process_rows(self, num_rows=None):
|
||||
# Im Re-Evaluierungsmodus wird num_rows ignoriert.
|
||||
if MODE == "2":
|
||||
print("Re-Evaluierungsmodus: Verarbeitung aller Zeilen mit 'x' in Spalte A.")
|
||||
else:
|
||||
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):
|
||||
# Modusabhängige Verarbeitung:
|
||||
# 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.
|
||||
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 ""
|
||||
website = row_data[2] if len(row_data) > 2 else ""
|
||||
update_range = f"H{row_num}:L{row_num}"
|
||||
@@ -316,11 +325,14 @@ class DataProcessor:
|
||||
if __name__ == "__main__":
|
||||
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"
|
||||
try:
|
||||
num_rows = int(input("Wieviele Zeilen sollen überprüft werden? "))
|
||||
except Exception as e:
|
||||
print("Ungültige Eingabe. Bitte eine Zahl eingeben.")
|
||||
exit(1)
|
||||
if MODE == "1":
|
||||
try:
|
||||
num_rows = int(input("Wieviele Zeilen sollen überprüft werden? "))
|
||||
except Exception as e:
|
||||
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.process_rows(num_rows)
|
||||
print("\n✅ Wikipedia-Auswertung abgeschlossen")
|
||||
|
||||
Reference in New Issue
Block a user