bugfix
This commit is contained in:
@@ -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): ...
|
||||
|
||||
Reference in New Issue
Block a user