diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 9a86b07a..4e1b298f 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1491,31 +1491,77 @@ class WikipediaScraper: return "k.A." def _extract_infobox_value(self, soup, target): - # (Unverändert zu deiner Version) + """Extrahiert gezielt Branche, Umsatz oder Mitarbeiter aus der Infobox.""" if not soup: return "k.A." + # Finde Infobox (flexiblere Suche) infobox = soup.find('table', class_=lambda c: c and any(kw in c.lower() for kw in ['infobox', 'vcard', 'unternehmen'])) - if not infobox: return "k.A." - keywords_map = { # ... (wie gehabt) - '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', 'angestellte', 'belegschaft', 'personalstärke'] + if not infobox: + debug_print(f" -> Infobox-Extraktion ('{target}'): Keine Infobox gefunden.") + return "k.A." + else: + # Logge die ersten ~100 Zeichen der gefundenen Infobox zum Vergleich + # debug_print(f" -> Infobox gefunden: {str(infobox)[:100]}...") + pass # Weniger Lärm + + # Keyword Mapping (wie gehabt) + 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', 'angestellte', 'belegschaft', 'personalstärke'] } keywords = keywords_map.get(target, []) - for row in infobox.find_all('tr'): - header = row.find('th'); value_cell = row.find('td') + debug_print(f" -> Suche nach '{target}' mit Keywords: {keywords}") # Logge Ziel und Keywords + + value_found = "k.A." # Standardmäßig nicht gefunden + + # Gehe Zeilen durch und logge Details + rows = infobox.find_all('tr') + for idx, row in enumerate(rows): + header = row.find('th') + value_cell = row.find('td') + + # Logge nur Zeilen, die sowohl Header als auch Value haben if header and value_cell: - header_text = clean_text(header.get_text()).lower() - if any(kw in header_text for kw in keywords): - raw_value = value_cell.get_text(separator=' ', strip=True) # Nimm Text inkl. Unterelementen - cleaned_raw_value = clean_text(raw_value) # Bereinige Whitespace etc. + header_text = header.get_text(strip=True) # Hole nur Text vom Header + header_text_lower = header_text.lower() + raw_value_text = value_cell.get_text(separator=' ', strip=True) # Hole allen Text aus der Zelle + + # Detailliertes Log für jede relevante Zeile + debug_print(f" -> Prüfe Zeile {idx}: TH='{header_text}' | TD='{raw_value_text[:50]}...'") + + # Prüfe Keyword-Match + matched_keyword = None + for kw in keywords: + if kw in header_text_lower: + matched_keyword = kw + break # Nimm das erste passende Keyword + + if matched_keyword: + debug_print(f" --> Keyword '{matched_keyword}' gefunden in TH '{header_text}'!") + cleaned_raw_value = clean_text(raw_value_text) # Bereinige TD Text + if target == 'branche': - # Entferne Referenzen etc. NACH get_text - clean_val = re.sub(r'\[\d+\]', '', cleaned_raw_value) # Entferne [1], [2] - clean_val = re.sub(r'\([^)]*\)', '', clean_val) # Entferne (...) - return clean_val.strip() if clean_val else "k.A." - elif target == 'umsatz': return extract_numeric_value(cleaned_raw_value, is_umsatz=True) - elif target == 'mitarbeiter': return extract_numeric_value(cleaned_raw_value, is_umsatz=False) - return "k.A." + clean_val = re.sub(r'\[\d+\]', '', cleaned_raw_value) + clean_val = re.sub(r'\([^)]*\)', '', clean_val).strip() + value_found = clean_val if clean_val else "k.A." + debug_print(f" --> Branche extrahiert: '{value_found}'") + break # Wenn Branche gefunden, höre auf zu suchen + elif target == 'umsatz': + numeric_val = extract_numeric_value(cleaned_raw_value, is_umsatz=True) + value_found = numeric_val + debug_print(f" --> Umsatz extrahiert (aus '{cleaned_raw_value}'): '{value_found}'") + break # Wenn Umsatz gefunden, höre auf + elif target == 'mitarbeiter': + numeric_val = extract_numeric_value(cleaned_raw_value, is_umsatz=False) + value_found = numeric_val + debug_print(f" --> Mitarbeiter extrahiert (aus '{cleaned_raw_value}'): '{value_found}'") + break # Wenn Mitarbeiter gefunden, höre auf + # else: + # debug_print(f" --- Kein passendes Keyword in TH gefunden.") # Optionales Log + + if value_found == "k.A.": + debug_print(f" -> Kein passender Eintrag für '{target}' in Infobox gefunden.") + return value_found # Diese Funktionen sind jetzt überflüssig, da _extract_infobox_value die Arbeit macht # def extract_full_infobox(self, soup): ...