This commit is contained in:
2025-04-19 17:44:51 +00:00
parent 025fa51363
commit fada980dc6

View File

@@ -1776,8 +1776,12 @@ class WikipediaScraper:
rows = infobox.find_all('tr')
self.logger.debug(f" -> Analysiere {len(rows)} Zeilen in der Infobox.")
for idx, row in enumerate(rows):
header_cells = row.find_all('th', recursive=False) # Nur direkte th Kinder
value_cells = row.find_all('td', recursive=False) # Nur direkte td Kinder
# --- NEUES DETAILLIERTES LOGGING PRO ZEILE ---
self.logger.debug(f" --- Prüfe Roh-HTML Zeile {idx}: {str(row)[:150]}...") # Zeige Anfang des HTML
header_cells = row.find_all('th', recursive=False)
value_cells = row.find_all('td', recursive=False)
self.logger.debug(f" -> Zeile {idx}: Gefunden {len(header_cells)} TH Zellen, {len(value_cells)} TD Zellen (recursive=False).")
# --- ENDE NEUES LOGGING ---
# Wir erwarten meistens ein th und ein td pro Zeile für Key-Value Paare
if len(header_cells) == 1 and len(value_cells) == 1:
@@ -1785,12 +1789,16 @@ class WikipediaScraper:
value_cell = value_cells[0]
header_text = header.get_text(strip=True)
# --- NEUES LOGGING: Header-Text VOR Keyword-Check ---
self.logger.debug(f" -> Zeile {idx} PASST Struktur: TH Text='{header_text}'")
# --- ENDE NEUES LOGGING ---
header_text_lower = header_text.lower()
# Normalisierte Version für flexibleren Match
header_text_normalized = re.sub(r'[\s:]', '', header_text_lower)
header_text_normalized = re.sub(r'[\s:]', '', header_text_lower) # Nicht mehr unbedingt nötig, da wir 'in' verwenden
raw_value_preview = value_cell.get_text(strip=True)[:50]
self.logger.debug(f" -> Prüfe Zeile {idx}: TH='{header_text}' (Norm: '{header_text_normalized}') | TD Preview='{raw_value_preview}...'")
# self.logger.debug(f" -> Prüfe Zeile {idx}: TH='{header_text}' (Norm: '{header_text_normalized}') | TD Preview='{raw_value_preview}...'") # Doppelt
matched_keyword = None
for kw in keywords:
@@ -1802,23 +1810,20 @@ class WikipediaScraper:
if matched_keyword:
self.logger.debug(f" --> Keyword '{matched_keyword}' gefunden in TH '{header_text}'!")
# Störende Elemente (Referenzen, unsichtbare Spans) im Value entfernen
# Störende Elemente entfernen... (Rest der Logik bleibt gleich)
for sup in value_cell.find_all(['sup', 'span']):
if (sup.name == 'sup' and sup.has_attr('class') and 'reference' in sup['class']) or \
(sup.name == 'span' and sup.get('style') and 'display:none' in sup['style']):
self.logger.debug(f" -> Entferne störendes Element: {sup.get_text(strip=True)}")
sup.decompose()
# Text extrahieren (mit Leerzeichen für <br>) und bereinigen
raw_value_text = value_cell.get_text(separator=' ', strip=True)
self.logger.debug(f" -> Roher TD-Text nach Decompose: '{raw_value_text}'")
cleaned_raw_value = clean_text(raw_value_text)
# Spezifische Verarbeitung
if target == 'branche':
# Einfache Bereinigung für Branche
clean_val = re.sub(r'\s*\([^)]*\)', '', cleaned_raw_value).strip() # Klammerzusätze entfernen
# Nimm nur den Teil vor einem möglichen Zeilenumbruch (manchmal gibt es Listen)
clean_val = re.sub(r'\s*\([^)]*\)', '', cleaned_raw_value).strip()
clean_val = clean_val.split('\n')[0].strip()
value_found = clean_val if clean_val else "k.A."
self.logger.debug(f" --> Branche extrahiert: '{value_found}'")
@@ -1831,11 +1836,9 @@ class WikipediaScraper:
value_found = numeric_val
self.logger.debug(f" --> Mitarbeiter extrahiert (aus '{cleaned_raw_value}'): '{value_found}'")
break # WICHTIG: Ersten Treffer für das gesuchte Ziel nehmen und Zeilenschleife verlassen
else:
# Logge Zeilen, die nicht dem Key-Value-Muster entsprechen (optional auf DEBUG)
# self.logger.debug(f" -> Überspringe Zeile {idx}: Struktur passt nicht (TH:{len(header_cells)}, TD:{len(value_cells)})")
pass
break # Ersten Treffer nehmen
# else: # Optional: Logge Zeilen, die übersprungen werden
# self.logger.debug(f" -> Zeile {idx}: Übersprungen (Struktur nicht 1 TH / 1 TD).")
# Ende der Zeilenschleife
if value_found != "k.A.":
@@ -1845,7 +1848,7 @@ class WikipediaScraper:
except Exception as e:
self.logger.exception(f"Fehler beim Durchlaufen der Infobox-Zeilen für '{target}': {e}")
return "k.A." # Fehler beim Parsen
return "k.A."
return value_found