diff --git a/wikipedia_scraper.py b/wikipedia_scraper.py index c6adeca4..cd5c4cf2 100644 --- a/wikipedia_scraper.py +++ b/wikipedia_scraper.py @@ -412,40 +412,76 @@ class WikipediaScraper: return {'sitz_stadt': sitz_stadt_val, 'sitz_land': sitz_land_val} @retry_on_failure - def extract_company_data(self, page_url): + def extract_company_data(self, url_or_page): """ - Extrahiert Firmendaten von einer gegebenen Wikipedia-Artikel-URL. + Extrahiert strukturierte Unternehmensdaten aus einem Wikipedia-Artikel (URL oder page-Objekt). + Gibt nun auch den gesamten Rohtext des Artikels ('full_text') und den Titel zurück. """ - default_result = {'url': page_url or 'k.A.', 'sitz_stadt': 'k.A.', 'sitz_land': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.'} - if not page_url or not isinstance(page_url, str) or "wikipedia.org/wiki/" not in page_url.lower(): - self.logger.warning(f"extract_company_data: Ungueltige URL '{page_url[:100]}...'.") - return default_result - - self.logger.info(f"Extrahiere Daten fuer Wiki-URL: {page_url[:100]}...") - soup = self._get_page_soup(page_url) - if not soup: - self.logger.error(f" -> Fehler: Konnte Seite {page_url[:100]}... nicht laden oder parsen.") - return default_result - - first_paragraph = self._extract_first_paragraph_from_soup(soup) - categories_val = self.extract_categories(soup) - branche_val = self._extract_infobox_value(soup, 'branche') - umsatz_val = self._extract_infobox_value(soup, 'umsatz') - mitarbeiter_val = self._extract_infobox_value(soup, 'mitarbeiter') - raw_sitz_string = self._extract_infobox_value(soup, 'sitz') - parsed_sitz = self._parse_sitz_string_detailed(raw_sitz_string) - sitz_stadt_val = parsed_sitz['sitz_stadt'] - sitz_land_val = parsed_sitz['sitz_land'] - - result = { - 'url': page_url, - 'sitz_stadt': sitz_stadt_val, - 'sitz_land': sitz_land_val, - 'first_paragraph': first_paragraph, - 'branche': branche_val, - 'umsatz': umsatz_val, - 'mitarbeiter': mitarbeiter_val, - 'categories': categories_val + default_result = { + 'url': 'k.A.', 'title': 'k.A.', 'sitz_stadt': 'k.A.', 'sitz_land': 'k.A.', + 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', + 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_text': '' } - self.logger.info(f" -> Extrahierte Daten: Stadt='{sitz_stadt_val}', Land='{sitz_land_val}', U='{umsatz_val}', M='{mitarbeiter_val}'") - return result + page = None + + try: + if isinstance(url_or_page, str) and "wikipedia.org" in url_or_page: + page_title = unquote(url_or_page.split('/wiki/')[-1].replace('_', ' ')) + page = wikipedia.page(title=page_title, auto_suggest=False, redirect=True) + elif not isinstance(url_or_page, str): # Annahme: es ist ein page-Objekt + page = url_or_page + else: + self.logger.warning(f"extract_company_data: Ungültiger Input '{str(url_or_page)[:100]}...'.") + return default_result + + self.logger.info(f"Extrahiere Daten für Wiki-Artikel: {page.title[:100]}...") + + # Grundlegende Daten direkt aus dem page-Objekt extrahieren + first_paragraph = page.summary.split('\n')[0] if page.summary else 'k.A.' + categories = ", ".join(page.categories) + full_text = page.content + + # Für Infobox-Daten benötigen wir weiterhin BeautifulSoup, da die 'wikipedia'-Bibliothek + # keinen strukturierten Zugriff darauf bietet. + soup = self._get_page_soup(page.url) + if not soup: + self.logger.warning(f" -> Konnte Seite für Soup-Parsing nicht laden. Extrahiere nur Basis-Daten.") + # Fallback, wenn Soup fehlschlägt + return { + 'url': page.url, 'title': page.title, 'sitz_stadt': 'k.A.', 'sitz_land': 'k.A.', + 'first_paragraph': first_paragraph, 'branche': 'k.A.', 'umsatz': 'k.A.', + 'mitarbeiter': 'k.A.', 'categories': categories, 'full_text': full_text + } + + # Extraktion der Infobox-Daten mit den bestehenden Helper-Funktionen + branche_val = self._extract_infobox_value(soup, 'branche') + umsatz_val = self._extract_infobox_value(soup, 'umsatz') + mitarbeiter_val = self._extract_infobox_value(soup, 'mitarbeiter') + raw_sitz_string = self._extract_infobox_value(soup, 'sitz') + parsed_sitz = self._parse_sitz_string_detailed(raw_sitz_string) + sitz_stadt_val = parsed_sitz['sitz_stadt'] + sitz_land_val = parsed_sitz['sitz_land'] + + # Sammle die finalen Daten + result = { + 'url': page.url, + 'title': page.title, + 'sitz_stadt': sitz_stadt_val, + 'sitz_land': sitz_land_val, + 'first_paragraph': first_paragraph, + 'branche': branche_val, + 'umsatz': umsatz_val, + 'mitarbeiter': mitarbeiter_val, + 'categories': categories, + 'full_text': full_text + } + + self.logger.info(f" -> Extrahierte Daten: Stadt='{sitz_stadt_val}', Land='{sitz_land_val}', U='{umsatz_val}', M='{mitarbeiter_val}'") + return result + + except wikipedia.exceptions.PageError: + self.logger.error(f" -> Fehler: Wikipedia-Artikel für '{str(url_or_page)[:100]}' konnte nicht gefunden werden (PageError).") + return {**default_result, 'url': str(url_or_page) if isinstance(url_or_page, str) else 'k.A.'} + except Exception as e: + self.logger.error(f" -> Unerwarteter Fehler bei der Extraktion von '{str(url_or_page)[:100]}': {e}") + return {**default_result, 'url': str(url_or_page) if isinstance(url_or_page, str) else 'k.A.'} \ No newline at end of file