This commit is contained in:
2025-04-18 14:20:36 +00:00
parent b33bea2dbd
commit 4a34292d3a

View File

@@ -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): ...