This commit is contained in:
2025-06-01 14:35:35 +00:00
parent 09b3247999
commit c4d9ba7fc5

View File

@@ -1885,39 +1885,41 @@ def serp_wikipedia_lookup(company_name, website=None, min_score=0.4):
# 1. Basisscore: Titelaehnlichkeit (Normalisierte Namen verwenden) # 1. Basisscore: Titelaehnlichkeit (Normalisierte Namen verwenden)
similarity = SequenceMatcher(None, normalized_title, normalized_search_name).ratio() similarity = SequenceMatcher(None, normalized_title, normalized_search_name).ratio()
score = similarity score = similarity
# logger.debug(f" -> Kandidat '{title[:100]}...': Basis-Aehnlichkeit={similarity:.2f}") # Zu viel Laerm im Debug # logger.debug(f" -> Kandidat '{title[:100]}...': Basis-Aehnlichkeit={similarity:.2f}")
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++ KORREKTUR / HINZUFÜGUNG HIER ++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bonus = 0.0 # <<<<------ HIER INITIALISIEREN! bonus = 0.0 # <<<<------ HIER INITIALISIEREN!
logger.debug(f" INIT BONUS: Wert von bonus direkt nach Initialisierung: {bonus} für Kandidat '{title[:50]}...'") # NEUE DEBUG-ZEILE logger.debug(f" INIT BONUS: Wert von bonus direkt nach Initialisierung: {bonus} für Kandidat '{title[:50]}...'")
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++ ENDE KORREKTUR / HINZUFÜGUNG ++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# NEU: Starker Bonus, wenn der normalisierte Suchname signifikant im normalisierten Titel enthalten ist # NEU: Starker Bonus, wenn der normalisierte Suchname signifikant im normalisierten Titel enthalten ist
# oder der normalisierte Titel im Suchnamen (für Fälle wie "Bosch (Unternehmen)" vs "Robert Bosch GmbH") # oder der normalisierte Titel im Suchnamen (für Fälle wie "Bosch (Unternehmen)" vs "Robert Bosch GmbH")
if normalized_search_name in normalized_title or normalized_title in normalized_search_name: # Sicherstellen, dass Strings nicht leer sind, bevor 'in' verwendet wird
if normalized_search_name and normalized_title and \
(normalized_search_name in normalized_title or normalized_title in normalized_search_name):
bonus += 0.3 # Relativ starker Bonus für gute Namensübereinstimmung bonus += 0.3 # Relativ starker Bonus für gute Namensübereinstimmung
# logger.debug(f" -> Bonus +0.3 fuer Namensübereinstimmung: '{normalized_search_name}' in '{normalized_title}'") logger.debug(f" -> Bonus +0.3 fuer Namensübereinstimmung: '{normalized_search_name}' in '{normalized_title}'")
# Bestehende Boni anpassen oder leicht reduzieren, wenn der obige Bonus schon greift # Bestehende Boni anpassen oder leicht reduzieren, wenn der obige Bonus schon greift
if "(unternehmen)" in title_lower: if "(unternehmen)" in title_lower:
bonus += 0.15 # Etwas reduziert, da Namensmatch wichtiger bonus += 0.15 # Etwas reduziert, da Namensmatch wichtiger
# logger.debug(" -> Bonus +0.15 fuer '(unternehmen)'") logger.debug(" -> Bonus +0.15 fuer '(unternehmen)'")
elif re.search(r'\b(?:gmbh|ag|kg|ltd|inc|corp|s\.?a\.?|se|group|holding)\b$', title_lower): elif re.search(r'\b(?:gmbh|ag|kg|ltd|inc|corp|s\.?a\.?|se|group|holding)\b$', title_lower):
bonus += 0.05 # Kleinerer Bonus bonus += 0.05 # Kleinerer Bonus
# logger.debug(" -> Bonus +0.05 fuer Rechtsform/Gruppen-Keyword") logger.debug(" -> Bonus +0.05 fuer Rechtsform/Gruppen-Keyword")
# 3. Bonus fuer Sprache (Deutsch bevorzugt) # 3. Bonus fuer Sprache (Deutsch bevorzugt)
if url.lower().startswith("https://de.wikipedia.org"): if url.lower().startswith("https://de.wikipedia.org"):
bonus += 0.05 bonus += 0.05
# logger.debug(" -> Bonus +0.05 fuer de.wikipedia.org") logger.debug(" -> Bonus +0.05 fuer de.wikipedia.org")
# Gesamtscore ist Basis-Aehnlichkeit plus Boni
total_score = score + bonus total_score = score + bonus
# logger.debug(f" -> Gesamtscore fuer '{title[:100]}...': {total_score:.3f} (Aehnlichkeit={similarity:.2f}, Bonus={bonus:.2f})") # Zu viel Laerm im Debug logger.debug(f" -> Gesamtscore fuer '{title[:100]}...': {total_score:.3f} (Aehnlichkeit={similarity:.2f}, Bonus={bonus:.2f})")
# Aktualisiere besten Treffer, wenn der aktuelle Kandidat einen hoeheren Score hat
# UND der Gesamtscore ueber dem definierten Mindestscore liegt.
if total_score > highest_score and total_score >= min_score: if total_score > highest_score and total_score >= min_score:
highest_score = total_score highest_score = total_score
best_match_url = url # Speichere die URL des besten Treffers best_match_url = url # Speichere die URL des besten Treffers
@@ -3226,23 +3228,33 @@ class WikipediaScraper:
if full_domain != "k.A.": if full_domain != "k.A.":
self.logger.debug(f" -> Suche nach Domain '{full_domain}' in externen Links des Artikels...") # <<< GEÄNDERT self.logger.debug(f" -> Suche nach Domain '{full_domain}' in externen Links des Artikels...") # <<< GEÄNDERT
try: try:
article_html = page.html() article_html = page.html()
if article_html: if article_html:
soup = BeautifulSoup(article_html, getattr(Config, 'HTML_PARSER', 'html.parser')) soup = BeautifulSoup(article_html, getattr(Config, 'HTML_PARSER', 'html.parser'))
external_links = soup.select('a[href^="http"]') external_links = soup.select('a[href^="http"]')
relevant_links = [] relevant_links = []
for link in external_links: for link_tag in external_links:
href = link.get('href', '') href = link_tag.get('href', '')
if href and isinstance(href, str) and full_domain in simple_normalize_url(href): if href and isinstance(href, str) and full_domain in simple_normalize_url(href):
if not any(ex in href.lower() for ex in ['wikipedia.org', 'wikimedia.org', 'wikidata.org', 'archive.org', 'webcitation.org']): if not any(ex in href.lower() for ex in ['wikipedia.org', 'wikimedia.org', 'wikidata.org', 'archive.org', 'webcitation.org']):
relevant_links.append(link) relevant_links.append(link_tag)
if relevant_links: if relevant_links:
domain_found = True domain_found = True
except KeyError as e_key:
if 'extlinks' in str(e_key).lower(): # Spezifisch für diesen häufigen Fehler
self.logger.warning(f"KeyError ('{e_key}') beim Zugriff auf page.html() oder Parsing für Domain-Check bei Artikel '{page.title[:100]}...'. Domain-Validierung übersprungen.")
domain_found = False
else:
self.logger.error(f"Unerwarteter KeyError bei Domain-Prüfung für '{page.title[:100]}...': {e_key}")
domain_found = False # Im Zweifel als nicht gefunden werten
# Überlegen, ob hier nicht `raise e_key` besser wäre, wenn es nicht 'extlinks' ist.
except Exception as e_link_check: except Exception as e_link_check:
self.logger.error( # <<< GEÄNDERT self.logger.error(
f"Fehler waehrend der Domain-Link-Pruefung fuer '{page.title[:100]}...': " f"Allgemeiner Fehler waehrend der Domain-Link-Pruefung fuer '{page.title[:100]}...': "
f"{type(e_link_check).__name__} - {e_link_check}" f"{type(e_link_check).__name__} - {e_link_check}"
) )
domain_found = False
# Dynamische Schwellenwert-Entscheidung # Dynamische Schwellenwert-Entscheidung
is_valid = False is_valid = False
@@ -4790,12 +4802,14 @@ class DataProcessor:
num_crm_ma = get_numeric_filter_value(crm_ma_val_str, is_umsatz=False) num_crm_ma = get_numeric_filter_value(crm_ma_val_str, is_umsatz=False)
num_wiki_ma = get_numeric_filter_value(wiki_ma_val_str, is_umsatz=False) num_wiki_ma = get_numeric_filter_value(wiki_ma_val_str, is_umsatz=False)
#self.logger.debug(f" Konsolidierung Input: CRM_U(L)='{num_crm_umsatz}', Wiki_U(W)='{num_wiki_umsatz}' (aus {source_of_wiki_data_origin}), CRM_M(M)='{num_crm_ma}', Wiki_M(X)='{num_wiki_ma}' (aus {source_of_wiki_data_origin}), Parent_D='{parent_account_name_d}'") wiki_source_log_info = "Unbekannt/Sheet (Wiki-Block nicht gelaufen)"
wiki_source_log_info = "Unbekannt/Sheet" # Default, falls Wiki-Block nicht lief
if 'source_of_wiki_data_origin_log_msg' in locals() and source_of_wiki_data_origin_log_msg: if 'source_of_wiki_data_origin_log_msg' in locals() and source_of_wiki_data_origin_log_msg:
wiki_source_log_info = source_of_wiki_data_origin_log_msg wiki_source_log_info = source_of_wiki_data_origin_log_msg
elif 'source_of_wiki_data_origin' in locals() and source_of_wiki_data_origin: # Fallback, falls die Variable anders hieß
wiki_source_log_info = source_of_wiki_data_origin
self.logger.debug(f" Konsolidierung Input: CRM_U(L)='{num_crm_umsatz}', Wiki_U(W)='{num_wiki_umsatz}' (aus {wiki_source_log_info}), CRM_M(M)='{num_crm_ma}', Wiki_M(X)='{num_wiki_ma}' (aus {wiki_source_log_info}), Parent_D='{parent_account_name_d}'") self.logger.debug(f" Konsolidierung Input: CRM_U(L)='{num_crm_umsatz}', Wiki_U(W)='{num_wiki_umsatz}' (aus {wiki_source_log_info}), CRM_M(M)='{num_crm_ma}', Wiki_M(X)='{num_wiki_ma}' (aus {wiki_source_log_info}), Parent_D='{parent_account_name_d}'")
if parent_account_name_d and parent_account_name_d.lower() != 'k.a.': if parent_account_name_d and parent_account_name_d.lower() != 'k.a.':
# Parent-Account (D) ist GEFÜLLT: Primär CRM-Daten der Tochter verwenden. # Parent-Account (D) ist GEFÜLLT: Primär CRM-Daten der Tochter verwenden.