diff --git a/wikipedia_scraper.py b/wikipedia_scraper.py index cd5c4cf2..3c078cfc 100644 --- a/wikipedia_scraper.py +++ b/wikipedia_scraper.py @@ -179,11 +179,10 @@ class WikipediaScraper: self.logger.log(log_level, f" => Artikel '{page.title[:100]}...' {'VALIDIERT' if is_valid else 'NICHT validiert'} (Grund: {reason})") return is_valid - def search_company_article(self, company_name, website=None, max_recursion_depth=1): + def search_company_article(self, company_name, website=None, parent_name=None, max_recursion_depth=1): """ Sucht einen passenden Wikipedia-Artikel fuer das Unternehmen und gibt das - wikipedia.WikipediaPage Objekt zurueck, wenn ein relevanter und validierter - Artikel gefunden wird. Behandelt explizit Begriffsklaerungsseiten. + wikipedia.WikipediaPage Objekt zurueck. Berücksichtigt nun auch den parent_name. """ if not company_name or str(company_name).strip() == "": self.logger.warning("Wikipedia search skipped: No company name provided.") @@ -198,9 +197,12 @@ class WikipediaScraper: processed_titles = set() original_search_name_norm = normalize_company_name(company_name) - - def check_page_recursive(title_to_check, current_depth): - if title_to_check in processed_titles or current_depth > max_recursion_depth: + + # KORRIGIERT: parent_name wird nun an die innere Funktion übergeben + def check_page_recursive(title_to_check, current_depth, parent_name_for_validation): + # KORRIGIERT: Sicherer Vergleich, falls max_recursion_depth None sein sollte + effective_max_depth = max_recursion_depth if max_recursion_depth is not None else 2 + if title_to_check in processed_titles or current_depth > effective_max_depth: return None processed_titles.add(title_to_check) @@ -216,18 +218,18 @@ class WikipediaScraper: page = None try: page = wikipedia.page(title_to_check, auto_suggest=False, preload=False, redirect=True) - if self._validate_article(page, company_name, website): + # KORRIGIERT: parent_name wird an die Validierung übergeben + if self._validate_article(page, company_name, website, parent_name_for_validation): self.logger.info(f" -> Titel '{page.title[:100]}...' erfolgreich validiert!") return page else: return None - # NEU: Fängt den "Page id ... does not match" Fehler gezielt ab except wikipedia.exceptions.PageError: self.logger.debug(f" -> Artikel '{title_to_check[:100]}' nicht gefunden (PageError).") return None except wikipedia.exceptions.DisambiguationError as e_disamb: self.logger.info(f" -> Begriffsklaerung '{e_disamb.title}' gefunden (Tiefe {current_depth}). Pruefe Optionen...") - if current_depth >= max_recursion_depth: return None + if current_depth >= effective_max_depth: return None relevant_options = [] for option in e_disamb.options: @@ -237,7 +239,8 @@ class WikipediaScraper: relevant_options.append(option) for option_to_check in relevant_options[:3]: - validated_page = check_page_recursive(option_to_check, current_depth + 1) + # KORRIGIERT: parent_name wird im rekursiven Aufruf weitergereicht + validated_page = check_page_recursive(option_to_check, current_depth + 1, parent_name_for_validation) if validated_page: return validated_page return None except Exception as e_page: @@ -250,14 +253,16 @@ class WikipediaScraper: # Hauptlogik der Suche self.logger.debug(f" -> Versuche direkten Match fuer '{company_name[:100]}...'") - page_found = check_page_recursive(company_name, 0) + # KORRIGIERT: parent_name wird an den ersten Aufruf übergeben + page_found = check_page_recursive(company_name, 0, parent_name) if page_found: return page_found self.logger.debug(f" -> Kein direkter Treffer. Starte Suche mit generierten Begriffen...") for term in search_terms: if term == company_name: continue self.logger.debug(f" -> Versuche Suchbegriff: '{term[:100]}...'") - page_found = check_page_recursive(term, 0) + # KORRIGIERT: parent_name wird an die weiteren Aufrufe übergeben + page_found = check_page_recursive(term, 0, parent_name) if page_found: return page_found self.logger.warning(f"Kein passender & validierter Wikipedia-Artikel fuer '{company_name[:100]}...' gefunden.")