This commit is contained in:
2025-05-30 14:29:19 +00:00
parent e56ff273fc
commit 2e583eade1

View File

@@ -4479,201 +4479,13 @@ class DataProcessor:
# ======================================================================
# === 2. Wikipedia Handling (Search, Extraction, Status Reset) ==========
# ======================================================================
# Dieser Schritt wird ausgefuehrt, wenn 'wiki' in steps_to_run enthalten ist UND
# (_needs_wiki_processing True ist ODER force_reeval True ist).
# _needs_wiki_processing prueft V (alt AN) und Y="X (URL Copied)" (alt S).
run_wiki_step = 'wiki' in steps_to_run
# _needs_wiki_processing prüft den Wikipedia Timestamp (Z) und AC="X (URL COPIED)"
wiki_processing_needed_based_on_status = self._needs_wiki_processing(row_data, force_reeval)
if run_wiki_step and wiki_processing_needed_based_on_status:
any_processing_done = True
# ... (Grund Message für Log erstellen) ...
self.logger.info(f"Zeile {row_num_in_sheet}: Fuehre WIKI Suche/Extraktion aus (Grund: {grund_message})...")
system_suggested_parent_name = self._get_cell_value_safe(row_data, "System Vorschlag Parent Account").strip() # Spalte O
current_wiki_url_in_sheet_for_daughter = self._get_cell_value_safe(row_data, "Wiki URL").strip() # Spalte R
url_to_extract_from = None # Die URL, von der WIRKLICH extrahiert wird
# Name, der für die Validierung des Artikels durch _validate_article verwendet wird
name_for_wiki_article_validation = company_name
source_of_wiki_data_origin = "Tochter" # Woher stammen die Wiki-Daten letztendlich?
additional_info_for_af = "" # Für Spalte AF "Begründung bei Abweichung"
# --- NEUE LOGIK: Parent-Account (O) prüfen ---
if system_suggested_parent_name and system_suggested_parent_name.lower() != "k.a.":
if not current_wiki_url_in_sheet_for_daughter or current_wiki_url_in_sheet_for_daughter.lower() == "k.a.":
# Szenario 1: Parent O gefüllt, Wiki R der Tochter leer/k.A.
self.logger.info(f" Zeile {row_num_in_sheet}: Parent '{system_suggested_parent_name}' (O) vorhanden, Wiki-URL der Tochter (R) leer. Versuche Wiki-Suche für Parent.")
try:
parent_page_object = self.wiki_scraper.search_company_article(
company_name=system_suggested_parent_name,
website=None # Keine spezifische Parent-Website bekannt, suche nur mit Namen
)
if parent_page_object:
url_to_extract_from = parent_page_object.url
name_for_wiki_article_validation = system_suggested_parent_name # Artikel wird gegen Parent-Namen validiert
source_of_wiki_data_origin = "Parent (O)"
additional_info_for_af = f"INFO: Wiki-Daten von Parent '{system_suggested_parent_name}' übernommen. "
self.logger.info(f" -> Wiki-Artikel für Parent '{system_suggested_parent_name}' gefunden: {url_to_extract_from}")
else:
self.logger.warning(f" -> Kein Wiki-Artikel für Parent '{system_suggested_parent_name}' gefunden. Standard-Tochter-Suche folgt.")
# url_to_extract_from bleibt None, die Standard-Logik unten greift.
except Exception as e_parent_wiki_search:
self.logger.error(f" -> Fehler bei Suche nach Wiki für Parent '{system_suggested_parent_name}': {e_parent_wiki_search}")
# Standard-Tochter-Suche folgt.
else:
# Szenario 2: Parent O gefüllt, UND Wiki R der Tochter auch gefüllt.
self.logger.info(f" Zeile {row_num_in_sheet}: Parent '{system_suggested_parent_name}' (O) vorhanden, aber auch Wiki-URL der Tochter (R) '{current_wiki_url_in_sheet_for_daughter}'. Tochter-Wiki hat Vorrang für Extraktion, falls notwendig.")
# Die Standard-Logik unten wird current_wiki_url_in_sheet_for_daughter verwenden.
# url_to_extract_from wird in der Standard-Logik ggf. mit current_wiki_url_in_sheet_for_daughter initialisiert.
pass # Keine Aktion hier, Standardlogik für Tochter greift.
# --- Standard-Logik für Wiki-URL der Tochter, wenn nicht schon eine Parent-URL gefunden wurde ---
if url_to_extract_from is None: # Nur wenn noch keine URL vom Parent kam
search_for_daughter_wiki_needed = False
status_ac_indicates_reparse = self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)" # Spalte AC
timestamp_z_is_empty = not self._get_cell_value_safe(row_data, "Wikipedia Timestamp").strip() # Spalte Z
# Hat die Tochter bereits eine valide aussehende URL in Spalte R?
r_url_is_valid_looking = current_wiki_url_in_sheet_for_daughter and \
"wikipedia.org/wiki/" in current_wiki_url_in_sheet_for_daughter.lower() and \
current_wiki_url_in_sheet_for_daughter.lower() not in ["k.a.", "kein artikel gefunden", "fehler bei suche"]
if status_ac_indicates_reparse:
self.logger.info(f" Zeile {row_num_in_sheet}: Status AC ('Chat Wiki Konsistenzpruefung') ist 'X (URL COPIED)'. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed = True
elif force_reeval:
if r_url_is_valid_looking:
self.logger.info(f" Zeile {row_num_in_sheet}: Re-Eval Modus. Nutze vorhandene Tochter-URL (R): {current_wiki_url_in_sheet_for_daughter}")
url_to_extract_from = current_wiki_url_in_sheet_for_daughter
else:
self.logger.info(f" Zeile {row_num_in_sheet}: Re-Eval Modus. Tochter-URL (R) leer/ungültig. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed = True
elif timestamp_z_is_empty: # Wikipedia Timestamp (Z) fehlt
if r_url_is_valid_looking:
self.logger.info(f" Zeile {row_num_in_sheet}: Wikipedia Timestamp (Z) fehlt. Validiere vorhandene Tochter-URL (R): {current_wiki_url_in_sheet_for_daughter}")
# Hier könnte eine explizite Validierung der Tochter-URL stehen (mit _validate_article),
# aber search_company_article macht das implizit, wenn eine URL direkt übergeben wird.
# Fürs Erste nehmen wir an, die URL wird verwendet und extract_company_data validiert.
url_to_extract_from = current_wiki_url_in_sheet_for_daughter
else:
self.logger.info(f" Zeile {row_num_in_sheet}: Wikipedia Timestamp (Z) fehlt und Tochter-URL (R) leer/ungültig. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed = True
elif not r_url_is_valid_looking: # Fallback, wenn Z nicht leer, aber R schlecht ist (z.B. "k.A.")
self.logger.info(f" Zeile {row_num_in_sheet}: Tochter-URL (R) ist ungültig ('{current_wiki_url_in_sheet_for_daughter}'). Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed = True
else: # R ist vorhanden und Timestamp Z ist gesetzt, kein Re-Eval -> keine Wiki-Aktion für Tochter nötig
self.logger.debug(f" Zeile {row_num_in_sheet}: Wiki-Verarbeitung für Tochter nicht nötig (Timestamp Z gesetzt, R vorhanden, kein Re-Eval/Reparse).")
if search_for_daughter_wiki_needed:
self.logger.info(f" -> Suche nach Wikipedia-Artikel für Tochter '{company_name}'...")
daughter_page_object = self.wiki_scraper.search_company_article(
company_name=company_name, # Name der Tochter
website=website_url # Website der Tochter
)
if daughter_page_object:
url_to_extract_from = daughter_page_object.url
name_for_wiki_article_validation = company_name # Artikel wird gegen Tochter-Namen validiert
source_of_wiki_data_origin = "Tochter (Suche)"
self.logger.info(f" -> Suche für Tochter '{company_name}' erfolgreich, gefundene URL: {url_to_extract_from}")
else:
self.logger.warning(f" -> Kein Wiki-Artikel für Tochter '{company_name}' gefunden.")
url_to_extract_from = "Kein Artikel gefunden"
# Wenn nach all dem url_to_extract_from immer noch None ist, aber eine URL in R stand, diese nehmen.
if url_to_extract_from is None and r_url_is_valid_looking:
url_to_extract_from = current_wiki_url_in_sheet_for_daughter
name_for_wiki_article_validation = company_name
source_of_wiki_data_origin = "Tochter (aus R)"
# --- DATENEXTRAKTION (von der ermittelten URL) ---
# Diese Logik wird nur ausgeführt, wenn eine gültige URL zum Extrahieren gefunden wurde
if url_to_extract_from and isinstance(url_to_extract_from, str) and \
url_to_extract_from.lower() not in ["k.a.", "kein artikel gefunden"] and \
not url_to_extract_from.startswith("FEHLER"):
self.logger.debug(f" -> Extrahiere Wiki-Daten von URL ({source_of_wiki_data_origin}): {url_to_extract_from[:100]}...")
try:
# WICHTIG: Die Validierung innerhalb von extract_company_data muss wissen, ob es sich um einen Parent-Artikel handelt,
# um den korrekten Namen (Parent-Name vs. Tochter-Name) für die Ähnlichkeitsprüfung zu verwenden.
# `extract_company_data` ruft `_validate_article` auf, das `company_name` als Argument bekommt.
# Wir übergeben hier `name_for_wiki_article_validation`.
extracted_data = self.wiki_scraper.extract_company_data(
page_url=url_to_extract_from,
# company_name_for_validation=name_for_wiki_article_validation # Diese Anpassung wäre in extract_company_data nötig
)
if extracted_data and isinstance(extracted_data, dict) and extracted_data.get('url') != 'k.A.':
final_wiki_data = extracted_data
wiki_data_updated_in_this_run = True
self.logger.info(f" -> Datenextraktion von {url_to_extract_from[:100]}... ({source_of_wiki_data_origin}) erfolgreich.")
# Wenn Daten vom Parent stammen, setze den AC-Vermerk
if source_of_wiki_data_origin == "Parent (O)":
ac_wert_fuer_parent_wiki = "INFO_PARENT_WIKI"
self.logger.info(f" -> Setze AC ('Chat Wiki Konsistenzpruefung') auf '{ac_wert_fuer_parent_wiki}', da Wiki-Daten von Parent.")
updates.append({
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Wiki Konsistenzpruefung"] + 1)}{row_num_in_sheet}',
'values': [[ac_wert_fuer_parent_wiki]]
})
# Leere auch die abhängigen Chat-Wiki-Spalten AD, AE
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begründung Wiki Inkonsistenz"] + 1)}{row_num_in_sheet}', 'values': [['']]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Wiki Artikel"] + 1)}{row_num_in_sheet}', 'values': [['']]})
# Und den Wiki Verif. Timestamp (AA) leeren
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"] + 1)}{row_num_in_sheet}', 'values': [['']]})
else: # Fehler bei Extraktion oder leeres Ergebnis
self.logger.error(f" -> Fehler bei Datenextraktion von {url_to_extract_from[:100]}... oder Extraktion war leer. Setze Daten auf 'k.A.'")
final_wiki_data['url'] = url_to_extract_from
for key_to_clear in ['sitz_stadt', 'sitz_land', 'first_paragraph', 'branche', 'umsatz', 'mitarbeiter', 'categories']:
final_wiki_data[key_to_clear] = 'k.A. (Extraktion fehlgeschlagen)' if key_to_clear == 'first_paragraph' else 'k.A.'
wiki_data_updated_in_this_run = True
except Exception as e_wiki_extract:
self.logger.error(f"FEHLER bei Wikipedia Datenextraktion von {url_to_extract_from[:100]}...: {e_wiki_extract}")
final_wiki_data['url'] = url_to_extract_from
for key_to_clear in ['sitz_stadt', 'sitz_land', 'first_paragraph', 'branche', 'umsatz', 'mitarbeiter', 'categories']:
final_wiki_data[key_to_clear] = f'k.A. (FEHLER Extraktion)' if key_to_clear == 'first_paragraph' else 'k.A.'
wiki_data_updated_in_this_run = True
else: # Wenn keine gültige URL zum Extrahieren bestimmt wurde
self.logger.debug(f" -> Keine Wiki-URL zum Extrahieren bestimmt ('{url_to_extract_from}'). Wiki-Daten nicht geändert oder bleiben auf Fehlerstatus.")
if isinstance(url_to_extract_from, str) and (url_to_extract_from.lower() == 'kein artikel gefunden' or url_to_extract_from.startswith("FEHLER")):
# Nur die URL-Spalte (R) mit dem Fehler/Hinweis aktualisieren, Rest auf k.A.
final_wiki_data['url'] = url_to_extract_from
for key_to_clear in ['sitz_stadt', 'sitz_land', 'first_paragraph', 'branche', 'umsatz', 'mitarbeiter', 'categories']:
final_wiki_data[key_to_clear] = 'k.A.'
wiki_data_updated_in_this_run = True # Markiere als Update, damit Timestamps gesetzt werden
# --- Sheet Updates für Wiki-Daten (R-Y) und Timestamps (Z, AA, AB) ---
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki URL"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('url', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Sitz Stadt"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('sitz_stadt', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Sitz Land"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('sitz_land', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Absatz"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('first_paragraph', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Branche"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('branche', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Umsatz"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('umsatz', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Mitarbeiter"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('mitarbeiter', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Kategorien"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('categories', 'k.A.')]]})
# Timestamp für Wikipedia-Extraktion (Z) immer setzen, wenn der Wiki-Schritt lief
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
# Innerhalb von DataProcessor._process_single_row (NEUER Wiki-Block)
# --- 2. Wikipedia Handling (Search, Extraction, Status Reset) ==========
run_wiki_step = 'wiki' in steps_to_run
wiki_processing_needed_based_on_status = self._needs_wiki_processing(row_data, force_reeval)
if run_wiki_step and wiki_processing_needed_based_on_status:
any_processing_done = True
# ---- KORREKTE VARIABLENERSTELLUNG UND VERWENDUNG FÜR LOGGING ----
grund_message_parts_wiki_list = [] # Eine Liste, um die Gründe zu sammeln
grund_message_parts_wiki_list = []
if force_reeval:
grund_message_parts_wiki_list.append('Re-Eval')
if not self._get_cell_value_safe(row_data, "Wikipedia Timestamp").strip():
@@ -4681,21 +4493,19 @@ class DataProcessor:
if self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)":
grund_message_parts_wiki_list.append("AC (Chat Wiki Konsistenzpruefung)='X (URL COPIED)'")
# Baue die Log-Nachricht zusammen
grund_message_wiki_str = ", ".join(filter(None, grund_message_parts_wiki_list))
if not grund_message_wiki_str:
grund_message_wiki_str = "Bedingung für Wiki-Bearbeitung erfüllt (Standard)" # Aussagekräftiger Fallback
grund_message_wiki_str = "Bedingung für Wiki-Bearbeitung erfüllt (Standard)"
# Verwende die korrekte Variable `grund_message_wiki_str`
# ----- KORREKTUR HIER -----
self.logger.info(f"Zeile {row_num_in_sheet}: Fuehre WIKI Schritte aus (Grund: {grund_message_wiki_str})...")
# ---- ENDE KORREKTUR ----
# ----- ENDE KORREKTUR -----
current_wiki_url_r = self._get_cell_value_safe(row_data, "Wiki URL").strip()
system_suggested_parent_o = self._get_cell_value_safe(row_data, "System Vorschlag Parent Account").strip()
# parent_account_name_d ist bereits oben in _process_single_row gelesen worden
url_for_extraction = None # Wird die URL sein, von der wir versuchen zu extrahieren
# name_for_validation_for_log = company_name # Für Logging, welcher Name für Validierung genutzt wurde
url_for_extraction = None
source_of_wiki_data_origin_log_msg = "Tochter (Initial)"
additional_info_for_af_col = ""
@@ -4705,7 +4515,7 @@ class DataProcessor:
(parent_account_name_d and parent_account_name_d.lower() != 'k.a.'):
self.logger.info(f" Zeile {row_num_in_sheet}: R leer, D ('{parent_account_name_d}') gesetzt. Suche Wiki für Parent D via SerpAPI.")
try:
potential_url = serp_wikipedia_lookup(parent_account_name_d, website=None)
potential_url = serp_wikipedia_lookup(parent_account_name_d, website=None) # SERP API KEY BENÖTIGT!
if potential_url and potential_url.lower() not in ["k.a.", "kein artikel gefunden"] and not potential_url.startswith("FEHLER"):
url_for_extraction = potential_url
source_of_wiki_data_origin_log_msg = f"Parent D ('{parent_account_name_d}')"
@@ -4714,7 +4524,6 @@ class DataProcessor:
else:
self.logger.warning(f" -> Kein Wiki-Artikel für Parent D '{parent_account_name_d}' gefunden.")
additional_info_for_af_col = f"WARN: Kein Wiki für Parent D '{parent_account_name_d}' gefunden. "
# Setze final_wiki_data hier nicht, da die Tochter-Suche noch folgen kann
except Exception as e_d_lookup_re:
self.logger.error(f"Fehler bei Wiki-Suche für Parent D '{parent_account_name_d}': {e_d_lookup_re}")
additional_info_for_af_col = f"ERR: Suche Parent D '{parent_account_name_d}' fehlgeschlagen. "
@@ -4722,35 +4531,69 @@ class DataProcessor:
# Priorität 2: Systemvorschlag Parent O, wenn R leer UND D nicht erfolgreich war/leer ist
if (url_for_extraction is None) and \
(not current_wiki_url_r or current_wiki_url_r.lower() == 'k.a.') and \
(system_suggested_parent_name_o and system_suggested_parent_name_o.lower() != 'k.a.'):
self.logger.info(f" Zeile {row_num_in_sheet}: R leer, D nicht genutzt/erfolglos. O ('{system_suggested_parent_name_o}') gesetzt. Suche Wiki für Parent O via SerpAPI.")
(system_suggested_parent_o and system_suggested_parent_o.lower() != 'k.a.'): # HIER WAR system_suggested_parent_name_o
self.logger.info(f" Zeile {row_num_in_sheet}: R leer, D nicht genutzt/erfolglos. O ('{system_suggested_parent_o}') gesetzt. Suche Wiki für Parent O via SerpAPI.")
try:
potential_url = serp_wikipedia_lookup(system_suggested_parent_name_o, website=None)
potential_url = serp_wikipedia_lookup(system_suggested_parent_o, website=None) # SERP API KEY BENÖTIGT!
if potential_url and potential_url.lower() not in ["k.a.", "kein artikel gefunden"] and not potential_url.startswith("FEHLER"):
# Hier keine explizite _validate_article, da serp_wikipedia_lookup schon filtert
# und wir davon ausgehen, dass der Parent-Name in O gut genug ist.
url_for_extraction = potential_url
source_of_wiki_data_origin_log_msg = f"Parent O ('{system_suggested_parent_name_o}')"
source_of_wiki_data_origin_log_msg = f"Parent O ('{system_suggested_parent_o}')"
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Wiki Konsistenzpruefung"] + 1)}{row_num_in_sheet}', 'values': [["INFO_PARENT_AUS_O"]]})
additional_info_for_af_col += f"INFO: Wiki-URL von Parent (aus O): {system_suggested_parent_name_o} via SerpAPI. "
additional_info_for_af_col += f"INFO: Wiki-URL von Parent (aus O): {system_suggested_parent_o} via SerpAPI. "
else:
self.logger.warning(f" -> Kein Wiki-Artikel für Parent O '{system_suggested_parent_name_o}' gefunden.")
additional_info_for_af_col += f"WARN: Kein Wiki für Parent O '{system_suggested_parent_name_o}' gefunden. "
self.logger.warning(f" -> Kein Wiki-Artikel für Parent O '{system_suggested_parent_o}' gefunden.")
additional_info_for_af_col += f"WARN: Kein Wiki für Parent O '{system_suggested_parent_o}' gefunden. "
except Exception as e_o_lookup_re:
self.logger.error(f"Fehler bei Wiki-Suche für Parent O '{system_suggested_parent_name_o}': {e_o_lookup_re}")
additional_info_for_af_col += f"ERR: Suche Parent O '{system_suggested_parent_name_o}' fehlgeschlagen. "
self.logger.error(f"Fehler bei Wiki-Suche für Parent O '{system_suggested_parent_o}': {e_o_lookup_re}")
additional_info_for_af_col += f"ERR: Suche Parent O '{system_suggested_parent_o}' fehlgeschlagen. "
# Priorität 3: Standard Tochter-Wiki-Logik (wenn keine Parent-URL ermittelt wurde oder R schon gefüllt war)
if url_for_extraction is None or (current_wiki_url_r and current_wiki_url_r.lower() != 'k.a.' and not current_wiki_url_r.startswith("FEHLER")):
# Wenn R schon eine URL hat (und keine Parent-URL gefunden wurde), diese verwenden.
# Oder wenn R leer war und Parent-Suchen fehlschlugen, dann neu für Tochter suchen.
if current_wiki_url_r and current_wiki_url_r.lower() not in ['k.a.'] and not current_wiki_url_r.startswith("FEHLER") and \
not (force_reeval or self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)"):
url_for_extraction = current_wiki_url_r
source_of_wiki_data_origin_log_msg = "Tochter (aus R, unverändert)"
self.logger.info(f" Zeile {row_num_in_sheet}: Nutze bestehende Tochter-URL aus R: {url_for_extraction}")
else: # R ist leer oder Re-Eval/Reparse -> Suche für Tochter
self.logger.info(f" Zeile {row_num_in_sheet}: Suche Wiki-Artikel für Tochter '{company_name}'...")
# Priorität 3: Standard Tochter-Wiki-Logik (wenn keine Parent-URL ermittelt wurde oder R schon gefüllt war und reevaluiert wird)
if url_for_extraction is None or \
(current_wiki_url_r and current_wiki_url_r.lower() != 'k.a.' and not current_wiki_url_r.startswith("FEHLER") and \
(force_reeval or self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)")):
# Bestimme, ob eine neue Suche für die Tochter nötig ist oder die vorhandene URL in R verwendet wird
search_for_daughter_wiki_needed_local = False # Lokale Variable für diesen Block
status_ac_indicates_reparse_local = self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)"
timestamp_z_is_empty_local = not self._get_cell_value_safe(row_data, "Wikipedia Timestamp").strip()
r_url_is_valid_looking_local = current_wiki_url_r and \
"wikipedia.org/wiki/" in current_wiki_url_r.lower() and \
current_wiki_url_r.lower() not in ["k.a.", "kein artikel gefunden", "fehler bei suche"]
if status_ac_indicates_reparse_local:
self.logger.info(f" Zeile {row_num_in_sheet}: Status AC ist 'X (URL COPIED)'. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed_local = True
elif force_reeval:
if r_url_is_valid_looking_local and url_for_extraction is None: # Nur wenn keine Parent-URL gefunden wurde
self.logger.info(f" Zeile {row_num_in_sheet}: Re-Eval Modus. Nutze vorhandene Tochter-URL (R): {current_wiki_url_r}")
url_for_extraction = current_wiki_url_r # Setze die URL hier
source_of_wiki_data_origin_log_msg = "Tochter (aus R, Re-Eval)"
elif url_for_extraction is None: # Keine Parent-URL und R ist schlecht
self.logger.info(f" Zeile {row_num_in_sheet}: Re-Eval Modus. Tochter-URL (R) leer/ungültig. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed_local = True
elif timestamp_z_is_empty_local and url_for_extraction is None:
if r_url_is_valid_looking_local:
self.logger.info(f" Zeile {row_num_in_sheet}: Wikipedia Timestamp (Z) fehlt. Nutze vorhandene Tochter-URL (R): {current_wiki_url_r}")
url_for_extraction = current_wiki_url_r
source_of_wiki_data_origin_log_msg = "Tochter (aus R, Z leer)"
else:
self.logger.info(f" Zeile {row_num_in_sheet}: Wikipedia Timestamp (Z) fehlt und Tochter-URL (R) leer/ungültig. Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed_local = True
elif not r_url_is_valid_looking_local and url_for_extraction is None:
self.logger.info(f" Zeile {row_num_in_sheet}: Tochter-URL (R) ist ungültig ('{current_wiki_url_r}'). Starte neue Suche für Tochter '{company_name}'.")
search_for_daughter_wiki_needed_local = True
elif url_for_extraction is None : # Wenn bisher keine URL gefunden/gesetzt wurde
self.logger.debug(f" Zeile {row_num_in_sheet}: Wiki-Verarbeitung für Tochter nicht nötig (Z gesetzt, R gültig, kein Re-Eval/Reparse, kein Parent-Fall).")
if search_for_daughter_wiki_needed_local:
self.logger.info(f" -> Suche nach Wikipedia-Artikel für Tochter '{company_name}'...")
try:
page_obj_tochter = self.wiki_scraper.search_company_article(company_name, website_url)
page_obj_tochter = self.wiki_scraper.search_company_article(company_name, website_url) # SERP API KEY BENÖTIGT!
if page_obj_tochter:
url_for_extraction = page_obj_tochter.url
source_of_wiki_data_origin_log_msg = "Tochter (Suche erfolgreich)"
@@ -4762,15 +4605,22 @@ class DataProcessor:
self.logger.error(f"Fehler bei Wiki-Suche für Tochter '{company_name}': {e_tochter_suche_psr}")
url_for_extraction = f"Fehler Suche Tochter: {str(e_tochter_suche_psr)[:50]}"
# Fallback, falls immer noch keine URL da ist, aber R eine hatte (und nicht reevaluiert wurde)
if url_for_extraction is None and current_wiki_url_r and \
current_wiki_url_r.lower() not in ['k.a.'] and not current_wiki_url_r.startswith("FEHLER") and \
not (force_reeval or self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip().upper() == "X (URL COPIED)"):
url_for_extraction = current_wiki_url_r
source_of_wiki_data_origin_log_msg = "Tochter (aus R, Fallback)"
self.logger.debug(f" Zeile {row_num_in_sheet}: Fallback auf bestehende Tochter-URL aus R: {url_for_extraction}")
# --- DATENEXTRAKTION ---
if url_for_extraction and isinstance(url_for_extraction, str) and \
url_for_extraction.lower() not in ["k.a.", "kein artikel gefunden"] and \
not url_for_extraction.startswith("FEHLER"):
self.logger.info(f" -> Extrahiere Wiki-Daten von URL ({source_of_wiki_data_origin_log_msg}): {url_for_extraction[:100]}...")
try:
# Für Parent-Artikel machen wir keine weitere explizite Validierung hier,
# wir vertrauen dem serp_wikipedia_lookup.
# Für Tochter-Artikel hat search_company_article bereits validiert.
extracted_data = self.wiki_scraper.extract_company_data(url_for_extraction)
if extracted_data and isinstance(extracted_data, dict) and extracted_data.get('url') != 'k.A.':
@@ -4778,12 +4628,18 @@ class DataProcessor:
wiki_data_updated_in_this_run = True
self.logger.info(f" -> Datenextraktion von {url_for_extraction[:100]}... erfolgreich.")
# AC und abhängige Spalten zurücksetzen, wenn es sich um eine Tochter-URL handelt
# und diese neu ist oder reevaluiert wurde.
# Wenn es eine Parent-URL war, wurde AC schon oben gesetzt.
# AC und abhängige Spalten zurücksetzen/anpassen
current_ac_val = self._get_cell_value_safe(row_data, "Chat Wiki Konsistenzpruefung").strip()
if not source_of_wiki_data_origin_log_msg.startswith("Parent") and \
(force_reeval or current_wiki_url_r != url_for_extraction or current_ac_val.upper() == "X (URL COPIED)"):
if source_of_wiki_data_origin_log_msg.startswith("Parent"):
# AC wurde schon auf INFO_PARENT_AUS_D/O gesetzt
# Hier sicherstellen, dass abhängige Spalten geleert werden, falls AC neu ist
if current_ac_val not in ["INFO_PARENT_AUS_D", "INFO_PARENT_AUS_O"]:
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"] + 1)}{row_num_in_sheet}', 'values': [['']]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begründung Wiki Inkonsistenz"] + 1)}{row_num_in_sheet}', 'values': [['']]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Wiki Artikel"] + 1)}{row_num_in_sheet}', 'values': [['']]})
elif force_reeval or current_wiki_url_r != url_for_extraction or current_ac_val.upper() == "X (URL COPIED)":
# Tochter-URL wurde neu gefunden oder reevaluiert -> AC auf '?' setzen für ChatGPT Verif.
self.logger.info(f" -> Setze AC auf '?' und leere AA, AD, AE für Tochter-Wiki-Update.")
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Wiki Konsistenzpruefung"] + 1)}{row_num_in_sheet}', 'values': [['?']]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"] + 1)}{row_num_in_sheet}', 'values': [['']]})
@@ -4797,19 +4653,19 @@ class DataProcessor:
wiki_data_updated_in_this_run = True
except Exception as e_wiki_extract_final_psr:
self.logger.error(f"FEHLER bei Wikipedia Datenextraktion von {url_for_extraction[:100]}...: {e_wiki_extract_final_psr}")
final_wiki_data['url'] = url_for_extraction # Zumindest die (ggf. fehlerhafte) URL speichern
self.logger.debug(traceback.format_exc())
final_wiki_data['url'] = url_for_extraction
for key_to_clear in ['sitz_stadt', 'sitz_land', 'first_paragraph', 'branche', 'umsatz', 'mitarbeiter', 'categories']:
final_wiki_data[key_to_clear] = f'k.A. (FEHLER Extr.)'
wiki_data_updated_in_this_run = True
elif url_for_extraction: # War "Kein Artikel..." oder "Fehler..."
elif url_for_extraction:
self.logger.info(f" -> Keine valide Wiki-URL zur Extraktion vorhanden: '{url_for_extraction}'. Setze Wiki-Felder auf k.A.")
final_wiki_data['url'] = url_for_extraction
for key_to_clear in ['sitz_stadt', 'sitz_land', 'first_paragraph', 'branche', 'umsatz', 'mitarbeiter', 'categories']:
final_wiki_data[key_to_clear] = 'k.A.'
wiki_data_updated_in_this_run = True # Es gab einen Versuch/Änderung
wiki_data_updated_in_this_run = True
# Updates für R-Y und Z (immer ausführen, wenn wiki_data_updated_in_this_run)
if wiki_data_updated_in_this_run:
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki URL"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('url', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Sitz Stadt"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('sitz_stadt', 'k.A.')]]})
@@ -4820,18 +4676,18 @@ class DataProcessor:
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Mitarbeiter"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('mitarbeiter', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Kategorien"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('categories', 'k.A.')]]})
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) # Z
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
if additional_info_for_af_col:
current_af_val = self._get_cell_value_safe(row_data, "Begründung bei Abweichung").strip()
new_af_val = (current_af_val + "; " + additional_info_for_af_col if current_af_val else additional_info_for_af_col).strip()
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Begründung bei Abweichung"] + 1)}{row_num_in_sheet}', 'values': [[new_af_val]]})
# SerpAPI Timestamp (AB) setzen, wenn eine SerpAPI-Suche für Parent D oder O durchgeführt wurde
if source_of_wiki_data_origin_log_msg.startswith("Parent D") or source_of_wiki_data_origin_log_msg.startswith("Parent O"):
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["SerpAPI Wiki Search Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
# --- Ende des Wikipedia-Blocks ---
# Der nächste Block wäre ChatGPT-Evaluationen