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