wikipedia_scraper.py aktualisiert
This commit is contained in:
@@ -412,40 +412,76 @@ class WikipediaScraper:
|
|||||||
return {'sitz_stadt': sitz_stadt_val, 'sitz_land': sitz_land_val}
|
return {'sitz_stadt': sitz_stadt_val, 'sitz_land': sitz_land_val}
|
||||||
|
|
||||||
@retry_on_failure
|
@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.'}
|
default_result = {
|
||||||
if not page_url or not isinstance(page_url, str) or "wikipedia.org/wiki/" not in page_url.lower():
|
'url': 'k.A.', 'title': 'k.A.', 'sitz_stadt': 'k.A.', 'sitz_land': 'k.A.',
|
||||||
self.logger.warning(f"extract_company_data: Ungueltige URL '{page_url[:100]}...'.")
|
'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.',
|
||||||
return default_result
|
'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_text': ''
|
||||||
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
self.logger.info(f" -> Extrahierte Daten: Stadt='{sitz_stadt_val}', Land='{sitz_land_val}', U='{umsatz_val}', M='{mitarbeiter_val}'")
|
page = None
|
||||||
return result
|
|
||||||
|
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.'}
|
||||||
Reference in New Issue
Block a user