bugfix
This commit is contained in:
@@ -3876,194 +3876,176 @@ class DataProcessor:
|
||||
|
||||
# @retry_on_failure # Vorsicht mit Retry auf dieser Ebene für die ganze Zeile
|
||||
# @retry_on_failure # Retry auf der gesamten Zeile ist riskant
|
||||
def _process_single_row(self, row_num_in_sheet, row_data, process_wiki=True, process_chatgpt=True, process_website=True):
|
||||
"""
|
||||
Verarbeitet die Daten für eine einzelne Zeile.
|
||||
Priorisiert jetzt die Wiki-Artikelsuche/-Validierung VOR der Extraktion.
|
||||
Prüft Timestamps für jeden Teilbereich.
|
||||
"""
|
||||
logging.info(f"--- Starte Verarbeitung für Zeile {row_num_in_sheet} ---")
|
||||
updates = []
|
||||
now_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
any_processing_done = False
|
||||
wiki_data_updated_in_this_run = False # Flag, ob Wiki-Daten (M-R) neu geschrieben wurden
|
||||
# @retry_on_failure # Retry auf der gesamten Zeile ist riskant
|
||||
def _process_single_row(self, row_num_in_sheet, row_data,
|
||||
process_wiki=True, process_chatgpt=True, process_website=True,
|
||||
force_reeval=False): # <-- Parameter ist entscheidend
|
||||
"""
|
||||
Verarbeitet die Daten für eine einzelne Zeile.
|
||||
Priorisiert Wiki-Artikelsuche/-Validierung VOR Extraktion.
|
||||
Prüft Timestamps, es sei denn force_reeval=True.
|
||||
"""
|
||||
logging.info(f"--- Starte Verarbeitung für Zeile {row_num_in_sheet} {'(Re-Eval)' if force_reeval else ''} ---")
|
||||
updates = []
|
||||
now_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
any_processing_done = False
|
||||
wiki_data_updated_in_this_run = False
|
||||
|
||||
# Hilfsfunktion für sicheren Zellenzugriff
|
||||
def get_cell_value(key):
|
||||
idx = COLUMN_MAP.get(key)
|
||||
if idx is not None and len(row_data) > idx: return row_data[idx]
|
||||
return ""
|
||||
# Hilfsfunktion für sicheren Zellenzugriff
|
||||
def get_cell_value(key):
|
||||
idx = COLUMN_MAP.get(key)
|
||||
if idx is not None and len(row_data) > idx: return row_data[idx]
|
||||
return ""
|
||||
|
||||
# Lese initiale Werte für spätere Verwendung
|
||||
company_name = get_cell_value("CRM Name")
|
||||
website_url = get_cell_value("CRM Website"); original_website = website_url
|
||||
crm_branche = get_cell_value("CRM Branche"); crm_beschreibung = get_cell_value("CRM Beschreibung")
|
||||
konsistenz_s = get_cell_value("Chat Wiki Konsistenzprüfung")
|
||||
website_raw = get_cell_value("Website Rohtext") or "k.A."
|
||||
website_summary = get_cell_value("Website Zusammenfassung") or "k.A."
|
||||
# Lese initiale Werte
|
||||
company_name = get_cell_value("CRM Name")
|
||||
website_url = get_cell_value("CRM Website"); original_website = website_url
|
||||
crm_branche = get_cell_value("CRM Branche"); crm_beschreibung = get_cell_value("CRM Beschreibung")
|
||||
konsistenz_s = get_cell_value("Chat Wiki Konsistenzprüfung")
|
||||
website_raw = get_cell_value("Website Rohtext") or "k.A."
|
||||
website_summary = get_cell_value("Website Zusammenfassung") or "k.A."
|
||||
|
||||
# Initialisiere finale Wiki-Daten (werden evtl. überschrieben)
|
||||
final_wiki_data = {
|
||||
'url': get_cell_value("Wiki URL") or 'k.A.',
|
||||
'first_paragraph': get_cell_value("Wiki Absatz") or 'k.A.',
|
||||
'branche': get_cell_value("Wiki Branche") or 'k.A.',
|
||||
'umsatz': get_cell_value("Wiki Umsatz") or 'k.A.',
|
||||
'mitarbeiter': get_cell_value("Wiki Mitarbeiter") or 'k.A.',
|
||||
'categories': get_cell_value("Wiki Kategorien") or 'k.A.'
|
||||
}
|
||||
final_page_object = None # Das validierte Page-Objekt
|
||||
final_wiki_data = {
|
||||
'url': get_cell_value("Wiki URL") or 'k.A.', 'first_paragraph': get_cell_value("Wiki Absatz") or 'k.A.',
|
||||
'branche': get_cell_value("Wiki Branche") or 'k.A.', 'umsatz': get_cell_value("Wiki Umsatz") or 'k.A.',
|
||||
'mitarbeiter': get_cell_value("Wiki Mitarbeiter") or 'k.A.', 'categories': get_cell_value("Wiki Kategorien") or 'k.A.'
|
||||
}
|
||||
final_page_object = None
|
||||
|
||||
# --- 1. Website Handling (prüft AT) ---
|
||||
website_ts_needed = process_website and not get_cell_value("Website Scrape Timestamp").strip()
|
||||
if website_ts_needed:
|
||||
any_processing_done = True
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte Website Verarbeitung (Lookup, Scrape, Summarize)...")
|
||||
if not website_url or website_url.strip().lower() == "k.a.":
|
||||
logging.debug(" -> Suche Website via SERP...")
|
||||
new_website = serp_website_lookup(company_name) # Annahme: nutzt logging
|
||||
if new_website != "k.A.":
|
||||
website_url = new_website
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["CRM Website"] + 1)}{row_num_in_sheet}', 'values': [[website_url]]})
|
||||
if website_url and website_url.strip().lower() != "k.a.":
|
||||
logging.debug(f" -> Scrape Rohtext von {website_url}...")
|
||||
new_website_raw = get_website_raw(website_url) # Annahme: nutzt logging
|
||||
logging.debug(f" -> Fasse Rohtext zusammen (Länge: {len(new_website_raw)})...")
|
||||
new_website_summary = summarize_website_content(new_website_raw) # Annahme: nutzt logging
|
||||
# Aktualisiere globale Variablen für spätere Schritte (ChatGPT)
|
||||
website_raw = new_website_raw
|
||||
website_summary = new_website_summary
|
||||
# Füge Updates für AR und AS hinzu
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Rohtext"] + 1)}{row_num_in_sheet}', 'values': [[website_raw]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Zusammenfassung"] + 1)}{row_num_in_sheet}', 'values': [[website_summary]]})
|
||||
else:
|
||||
logging.warning(f" -> Keine gültige Website gefunden/vorhanden für {company_name}.")
|
||||
website_raw, website_summary = "k.A.", "k.A."
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Rohtext"] + 1)}{row_num_in_sheet}', 'values': [['k.A.']]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Zusammenfassung"] + 1)}{row_num_in_sheet}', 'values': [['k.A.']]})
|
||||
# Setze AT Timestamp
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Scrape Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
elif process_website:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe Website (AT vorhanden).")
|
||||
# --- 1. Website Handling (Prüft AT oder force_reeval) ---
|
||||
website_ts_missing = not get_cell_value("Website Scrape Timestamp").strip()
|
||||
website_processing_needed = process_website and (force_reeval or website_ts_missing)
|
||||
|
||||
|
||||
# --- 2. Wikipedia Artikel Findung/Validierung (prüft AN oder S='X(Copied)') ---
|
||||
# Diese Logik bestimmt, OB und WELCHE Seite extrahiert werden soll.
|
||||
wiki_ts_an_missing = not get_cell_value("Wikipedia Timestamp").strip()
|
||||
status_s_indicates_reparse = konsistenz_s.strip().upper() == "X (URL COPIED)"
|
||||
wiki_processing_needed = process_wiki and (wiki_ts_an_missing or status_s_indicates_reparse)
|
||||
url_to_potentially_parse = get_cell_value("Wiki URL").strip() # Die URL, die aktuell in Spalte M steht
|
||||
|
||||
if wiki_processing_needed:
|
||||
any_processing_done = True
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte Wikipedia Artikel Findung/Validierung (AN fehlt? {wiki_ts_an_missing}, S='X(Copied)'? {status_s_indicates_reparse})...")
|
||||
# --- NEUE LOGIK: Suche/Validierung zuerst ---
|
||||
validated_page = None
|
||||
# Prüfe zuerst, ob die URL in M direkt valide ist
|
||||
if url_to_potentially_parse and url_to_potentially_parse.lower() not in ["k.a.", "kein artikel gefunden"] and url_to_potentially_parse.lower().startswith("http"):
|
||||
logging.debug(f" -> Prüfe Validität der vorhandenen URL aus Spalte M: {url_to_potentially_parse}")
|
||||
try:
|
||||
# Wir brauchen das Page-Objekt für _validate_article
|
||||
page_from_m = wikipedia.page(url_to_potentially_parse.split('/wiki/')[-1].replace('_', ' '), auto_suggest=False, preload=True)
|
||||
if self.wiki_scraper._validate_article(page_from_m, company_name, website_url):
|
||||
validated_page = page_from_m
|
||||
logging.info(f" -> Vorhandene URL aus M '{validated_page.url}' ist valide.")
|
||||
else:
|
||||
logging.debug(f" -> Vorhandene URL aus M '{page_from_m.title}' ist NICHT valide.")
|
||||
except wikipedia.exceptions.PageError:
|
||||
logging.warning(f" -> Seite für vorhandene URL aus M '{url_to_potentially_parse}' nicht gefunden (PageError).")
|
||||
except wikipedia.exceptions.DisambiguationError as e_disamb_m:
|
||||
logging.info(f" -> Vorhandene URL aus M '{url_to_potentially_parse}' ist eine Begriffsklärung. Starte Suche...")
|
||||
# Wenn M eine BKL ist, explizit neu suchen
|
||||
validated_page = self.wiki_scraper.search_company_article(company_name, website_url)
|
||||
except Exception as e_val_m:
|
||||
logging.error(f" -> Fehler beim Prüfen der URL aus M '{url_to_potentially_parse}': {e_val_m}")
|
||||
|
||||
# Wenn URL aus M nicht valide war oder keine vorhanden war, starte die Suche
|
||||
if not validated_page:
|
||||
logging.info(f" -> Keine valide URL in M gefunden oder Prüfung fehlgeschlagen. Starte Wikipedia-Suche für '{company_name}'...")
|
||||
validated_page = self.wiki_scraper.search_company_article(company_name, website_url) # Nutzt die verbesserte Suche inkl. Disambiguation
|
||||
|
||||
# --- Datenextraktion NACH erfolgreicher Findung/Validierung ---
|
||||
if validated_page:
|
||||
logging.info(f" -> Valider Artikel gefunden/bestätigt: {validated_page.url}. Extrahiere Daten...")
|
||||
final_page_object = validated_page # Speichere für spätere Verwendung
|
||||
extracted_data = self.wiki_scraper.extract_company_data(validated_page.url) # Extrahiere Daten von der KORREKTEN Seite
|
||||
final_wiki_data = extracted_data # Überschreibe die initialen Daten
|
||||
wiki_data_updated_in_this_run = True # Setze Flag, da M-R neu geschrieben wird
|
||||
logging.info(f" -> Datenextraktion für '{validated_page.title}' abgeschlossen.")
|
||||
else:
|
||||
logging.warning(f" -> Konnte keinen validen Wikipedia Artikel für '{company_name}' finden/bestätigen.")
|
||||
# Setze Wiki-Daten auf "Nicht gefunden" / "k.A."
|
||||
final_wiki_data = {'url': 'Kein Artikel gefunden', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.'}
|
||||
wiki_data_updated_in_this_run = True # Auch hier Flag setzen, da wir M-R überschreiben
|
||||
|
||||
# Füge Updates für M-R und AN hinzu
|
||||
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 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.')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) # Setze AN Timestamp
|
||||
|
||||
# Setze S zurück, wenn Trigger 'X(Copied)' war oder wenn URL sich geändert hat
|
||||
if status_s_indicates_reparse or (url_to_potentially_parse != final_wiki_data.get('url')):
|
||||
s_idx = COLUMN_MAP.get("Chat Wiki Konsistenzprüfung")
|
||||
if s_idx is not None:
|
||||
s_let = self.sheet_handler._get_col_letter(s_idx + 1)
|
||||
updates.append({'range': f'{s_let}{row_num_in_sheet}', 'values': [["?"]]})
|
||||
logging.info(f" -> Status S zurückgesetzt auf '?' für erneute Verifikation.")
|
||||
|
||||
elif process_wiki:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe Wikipedia Verarbeitung (AN vorhanden UND S != 'X (URL Copied)').")
|
||||
# WICHTIG: Obwohl wir nicht neu parsen, müssen wir die final_wiki_data
|
||||
# mit den bereits im Sheet stehenden Werten für den nächsten Schritt befüllen.
|
||||
# Das ist oben bei der Initialisierung von final_wiki_data bereits geschehen.
|
||||
|
||||
# --- 3. ChatGPT Evaluationen (Branch etc.) ---
|
||||
chat_ts_ao_missing = not get_cell_value("Timestamp letzte Prüfung").strip()
|
||||
# Trigger: AO fehlt ODER Wiki-Daten wurden in DIESEM Lauf neu geschrieben (M-R, AN)
|
||||
run_chat_eval = process_chatgpt and (chat_ts_ao_missing or wiki_data_updated_in_this_run)
|
||||
|
||||
if run_chat_eval:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte ChatGPT Evaluationen (Grund: AO fehlt? {chat_ts_ao_missing}, Wiki gerade aktualisiert? {wiki_data_updated_in_this_run})...")
|
||||
any_processing_done = True
|
||||
|
||||
# Nutze IMMER die 'final_wiki_data' für die Evaluation
|
||||
branch_result = evaluate_branche_chatgpt(
|
||||
crm_branche, crm_beschreibung,
|
||||
final_wiki_data.get('branche', 'k.A.'),
|
||||
final_wiki_data.get('categories', 'k.A.'),
|
||||
website_summary # Kommt aus Schritt 1 oder initialen Werten
|
||||
) # Annahme: nutzt logging
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'Fehler')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Konsistenz Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('consistency', 'Fehler')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begründung Abweichung Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'Fehler')]]})
|
||||
|
||||
# ... (Hier weitere ChatGPT Evaluationen, immer mit final_wiki_data und aktuellen website_*) ...
|
||||
|
||||
# Setze Timestamp letzte Prüfung (AO)
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Prüfung"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
|
||||
elif process_chatgpt:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe ChatGPT Evaluationen (AO vorhanden UND Wiki nicht gerade aktualisiert).")
|
||||
|
||||
# --- 4. Abschließende Updates ---
|
||||
if any_processing_done:
|
||||
# Setze Version nur, wenn *irgendetwas* in dieser Zeile gemacht wurde
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Version"] + 1)}{row_num_in_sheet}', 'values': [[Config.VERSION]]})
|
||||
|
||||
# --- 5. Batch Update für diese Zeile ---
|
||||
if updates:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Sende Batch-Update mit {len(updates)} Operationen...")
|
||||
success = self.sheet_handler.batch_update_cells(updates)
|
||||
if not success: logging.error(f"Zeile {row_num_in_sheet}: FEHLER beim Batch-Update.")
|
||||
if website_processing_needed:
|
||||
any_processing_done = True
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte Website Verarbeitung (Grund: {'Re-Eval' if force_reeval else 'AT fehlt'})...")
|
||||
if not website_url or website_url.strip().lower() == "k.a.":
|
||||
logging.debug(" -> Suche Website via SERP...")
|
||||
new_website = serp_website_lookup(company_name)
|
||||
if new_website != "k.A.":
|
||||
website_url = new_website
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["CRM Website"] + 1)}{row_num_in_sheet}', 'values': [[website_url]]})
|
||||
if website_url and website_url.strip().lower() != "k.a.":
|
||||
logging.debug(f" -> Scrape Rohtext von {website_url}...")
|
||||
new_website_raw = get_website_raw(website_url)
|
||||
logging.debug(f" -> Fasse Rohtext zusammen (Länge: {len(new_website_raw)})...")
|
||||
new_website_summary = summarize_website_content(new_website_raw)
|
||||
website_raw = new_website_raw
|
||||
website_summary = new_website_summary
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Rohtext"] + 1)}{row_num_in_sheet}', 'values': [[website_raw]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Zusammenfassung"] + 1)}{row_num_in_sheet}', 'values': [[website_summary]]})
|
||||
else:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Keine Updates zum Schreiben.")
|
||||
logging.warning(f" -> Keine gültige Website gefunden/vorhanden für {company_name}.")
|
||||
website_raw, website_summary = "k.A.", "k.A."
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Rohtext"] + 1)}{row_num_in_sheet}', 'values': [['k.A.']]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Zusammenfassung"] + 1)}{row_num_in_sheet}', 'values': [['k.A.']]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Website Scrape Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
elif process_website:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe Website (AT vorhanden und kein Re-Eval).")
|
||||
|
||||
logging.info(f"--- Verarbeitung für Zeile {row_num_in_sheet} abgeschlossen ---")
|
||||
# Kurze Pause zwischen den Zeilen im sequenziellen Modus
|
||||
time.sleep(max(0.1, getattr(Config, 'RETRY_DELAY', 5) / 20)) # Kleine Pause
|
||||
# --- 2. Wikipedia Artikel Findung/Validierung (Prüft AN, S='X(Copied)' oder force_reeval) ---
|
||||
wiki_ts_an_missing = not get_cell_value("Wikipedia Timestamp").strip()
|
||||
status_s_indicates_reparse = konsistenz_s.strip().upper() == "X (URL COPIED)"
|
||||
wiki_processing_needed = process_wiki and (force_reeval or wiki_ts_an_missing or status_s_indicates_reparse)
|
||||
url_to_potentially_parse = get_cell_value("Wiki URL").strip()
|
||||
|
||||
if wiki_processing_needed:
|
||||
any_processing_done = True
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte Wikipedia Artikel Findung/Validierung (Grund: {'Re-Eval' if force_reeval else f'AN fehlt? {wiki_ts_an_missing}, S=X(Copied)? {status_s_indicates_reparse}'})...")
|
||||
validated_page = None
|
||||
if url_to_potentially_parse and url_to_potentially_parse.lower() not in ["k.a.", "kein artikel gefunden"] and url_to_potentially_parse.lower().startswith("http"):
|
||||
logging.debug(f" -> Prüfe Validität der vorhandenen URL aus Spalte M: {url_to_potentially_parse}")
|
||||
try:
|
||||
page_from_m = wikipedia.page(url_to_potentially_parse.split('/wiki/')[-1].replace('_', ' '), auto_suggest=False, preload=True)
|
||||
if self.wiki_scraper._validate_article(page_from_m, company_name, website_url):
|
||||
validated_page = page_from_m
|
||||
logging.info(f" -> Vorhandene URL aus M '{validated_page.url}' ist valide.")
|
||||
else:
|
||||
logging.debug(f" -> Vorhandene URL aus M '{page_from_m.title}' ist NICHT valide.")
|
||||
except wikipedia.exceptions.PageError:
|
||||
logging.warning(f" -> Seite für vorhandene URL aus M '{url_to_potentially_parse}' nicht gefunden (PageError).")
|
||||
except wikipedia.exceptions.DisambiguationError as e_disamb_m:
|
||||
logging.info(f" -> Vorhandene URL aus M '{url_to_potentially_parse}' ist eine Begriffsklärung. Starte Suche...")
|
||||
validated_page = self.wiki_scraper.search_company_article(company_name, website_url)
|
||||
except Exception as e_val_m:
|
||||
logging.error(f" -> Fehler beim Prüfen der URL aus M '{url_to_potentially_parse}': {e_val_m}")
|
||||
|
||||
if not validated_page:
|
||||
logging.info(f" -> Keine valide URL in M gefunden oder Prüfung fehlgeschlagen. Starte Wikipedia-Suche für '{company_name}'...")
|
||||
validated_page = self.wiki_scraper.search_company_article(company_name, website_url)
|
||||
|
||||
if validated_page:
|
||||
logging.info(f" -> Valider Artikel gefunden/bestätigt: {validated_page.url}. Extrahiere Daten...")
|
||||
final_page_object = validated_page
|
||||
extracted_data = self.wiki_scraper.extract_company_data(validated_page.url)
|
||||
final_wiki_data = extracted_data
|
||||
wiki_data_updated_in_this_run = True
|
||||
logging.info(f" -> Datenextraktion für '{validated_page.title}' abgeschlossen.")
|
||||
else:
|
||||
logging.warning(f" -> Konnte keinen validen Wikipedia Artikel für '{company_name}' finden/bestätigen.")
|
||||
final_wiki_data = {'url': 'Kein Artikel gefunden', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.'}
|
||||
wiki_data_updated_in_this_run = True
|
||||
|
||||
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 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.')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
|
||||
if status_s_indicates_reparse or (url_to_potentially_parse != final_wiki_data.get('url')) or force_reeval:
|
||||
s_idx = COLUMN_MAP.get("Chat Wiki Konsistenzprüfung")
|
||||
if s_idx is not None:
|
||||
s_let = self.sheet_handler._get_col_letter(s_idx + 1)
|
||||
updates.append({'range': f'{s_let}{row_num_in_sheet}', 'values': [["?"]]})
|
||||
logging.info(f" -> Status S zurückgesetzt auf '?' für erneute Verifikation.")
|
||||
|
||||
elif process_wiki:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe Wikipedia Verarbeitung (AN vorhanden, kein S=X(Copied) und kein Re-Eval).")
|
||||
|
||||
# --- 3. ChatGPT Evaluationen (Branch etc.) ---
|
||||
chat_ts_ao_missing = not get_cell_value("Timestamp letzte Prüfung").strip()
|
||||
run_chat_eval = process_chatgpt and (force_reeval or chat_ts_ao_missing or wiki_data_updated_in_this_run)
|
||||
|
||||
if run_chat_eval:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Starte ChatGPT Evaluationen (Grund: {'Re-Eval' if force_reeval else f'AO fehlt? {chat_ts_ao_missing}, Wiki gerade aktualisiert? {wiki_data_updated_in_this_run}'})...")
|
||||
any_processing_done = True
|
||||
|
||||
branch_result = evaluate_branche_chatgpt(
|
||||
crm_branche, crm_beschreibung,
|
||||
final_wiki_data.get('branche', 'k.A.'),
|
||||
final_wiki_data.get('categories', 'k.A.'),
|
||||
website_summary
|
||||
)
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Vorschlag Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'Fehler')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Konsistenz Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('consistency', 'Fehler')]]})
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begründung Abweichung Branche"] + 1)}{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'Fehler')]]})
|
||||
|
||||
# --- Hier Platz für weitere ChatGPT-Calls ---
|
||||
# z.B. FSM Relevanz, Mitarbeiter-Schätzung etc.
|
||||
# Denke daran, 'final_wiki_data' und 'website_summary' / 'website_raw' zu verwenden.
|
||||
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Timestamp letzte Prüfung"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
|
||||
elif process_chatgpt:
|
||||
logging.debug(f"Zeile {row_num_in_sheet}: Überspringe ChatGPT Evaluationen (AO vorhanden, Wiki nicht gerade aktualisiert und kein Re-Eval).")
|
||||
|
||||
# --- 4. Abschließende Updates ---
|
||||
if any_processing_done:
|
||||
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Version"] + 1)}{row_num_in_sheet}', 'values': [[Config.VERSION]]})
|
||||
|
||||
# --- 5. Batch Update für diese Zeile ---
|
||||
if updates:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Sende Batch-Update mit {len(updates)} Operationen...")
|
||||
success = self.sheet_handler.batch_update_cells(updates)
|
||||
if not success: logging.error(f"Zeile {row_num_in_sheet}: FEHLER beim Batch-Update.")
|
||||
else:
|
||||
if not any_processing_done:
|
||||
logging.info(f"Zeile {row_num_in_sheet}: Keine Updates zum Schreiben (alle Schritte übersprungen).")
|
||||
|
||||
logging.info(f"--- Verarbeitung für Zeile {row_num_in_sheet} abgeschlossen ---")
|
||||
time.sleep(max(0.1, getattr(Config, 'RETRY_DELAY', 5) / 20))
|
||||
|
||||
|
||||
def process_rows_sequentially(self, start_row_index, num_rows_to_process, process_wiki=True, process_chatgpt=True, process_website=True):
|
||||
@@ -4152,7 +4134,9 @@ class DataProcessor:
|
||||
try:
|
||||
# Führe volle Verarbeitung für diese Zeile durch
|
||||
# _process_single_row prüft intern Timestamps AN, AT, AO etc.
|
||||
self._process_single_row(row_num, row_data, process_wiki=True, process_chatgpt=True, process_website=True)
|
||||
self._process_single_row(row_num, row_data,
|
||||
process_wiki=True, process_chatgpt=True, process_website=True,
|
||||
force_reeval=True)
|
||||
processed_count += 1
|
||||
rows_actually_processed.append(row_num) # Füge zur Liste der verarbeiteten hinzu
|
||||
|
||||
|
||||
Reference in New Issue
Block a user