diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 74c2dde3..d8b9b4ca 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -13,7 +13,7 @@ import csv # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.2.1" # v1.2.1: Neue Spaltenzuordnung; Timestamp in Spalte Y, Version in Spalte Z + VERSION = "v1.2.2" # v1.2.2: Neue Spaltenzuordnung & Wikipedia-Kategorien extrahieren LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -235,6 +235,15 @@ class WikipediaScraper: except Exception as e: debug_print(f"Fehler beim Extrahieren des ersten Absatzes: {e}") return "k.A." + def extract_categories(self, soup): + """Extrahiert Wikipedia-Kategorien als kommagetrennte Liste.""" + cat_div = soup.find('div', id="mw-normal-catlinks") + if cat_div: + ul = cat_div.find('ul') + if ul: + cats = [clean_text(li.get_text()) for li in ul.find_all('li')] + return ", ".join(cats) + return "k.A." def _extract_infobox_value(self, soup, target): infobox = soup.find('table', class_=lambda c: c and any(kw in c.lower() for kw in ['infobox', 'vcard', 'unternehmen'])) if not infobox: @@ -280,7 +289,7 @@ class WikipediaScraper: def extract_company_data(self, page_url): if not page_url: return {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', - 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'} + 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'} try: response = requests.get(page_url) soup = BeautifulSoup(response.text, Config.HTML_PARSER) @@ -291,6 +300,7 @@ class WikipediaScraper: raw_mitarbeiter = extracted_fields.get('Mitarbeiter', self._extract_infobox_value(soup, 'mitarbeiter')) umsatz_val = extract_numeric_value(raw_umsatz, is_umsatz=True) mitarbeiter_val = extract_numeric_value(raw_mitarbeiter, is_umsatz=False) + categories_val = self.extract_categories(soup) first_paragraph = self.extract_first_paragraph(page_url) return { 'url': page_url, @@ -298,12 +308,13 @@ class WikipediaScraper: 'branche': raw_branche, 'umsatz': umsatz_val, 'mitarbeiter': mitarbeiter_val, + 'categories': categories_val, 'full_infobox': full_infobox } except Exception as e: debug_print(f"Extraktionsfehler: {str(e)}") return {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', - 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'} + 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'} @retry_on_failure def search_company_article(self, company_name, website): search_terms = self._generate_search_terms(company_name, website) @@ -347,33 +358,34 @@ class DataProcessor: if i >= self.sheet_handler.get_start_index(): self._process_single_row(i, row) def _process_single_row(self, row_num, row_data): - # In beiden Modi (normal und Re-Evaluierung) verwenden wir nun das neue Schema: - # Firmenname: Spalte B (Index 1), Website: Spalte C (Index 2) - # Extrahierte Wikipedia-Daten werden in Spalten J bis N geschrieben. - # Timestamp (jetzt) in Spalte Y, Version in Spalte Z. + # Im neuen Schema: Firmenname in Spalte B (Index 1), Website in Spalte C (Index 2). + # Wikipedia-Daten werden in Spalten J bis O geschrieben: + # J: Wikipedia URL, K: Wikipedia Absatz, L: Wikipedia Branche, M: Wikipedia Umsatz, N: Wikipedia Mitarbeiter, O: Wikipedia Kategorien. + # Timestamp (jetzt) in Spalte Y und Version in Spalte Z. company_name = row_data[1] if len(row_data) > 1 else "" website = row_data[2] if len(row_data) > 2 else "" - update_range = f"J{row_num}:N{row_num}" # Wikipedia URL, Absatz, Branche, Umsatz, Mitarbeiter - dt_range = f"Y{row_num}" # Timestamp letzte Prüfung - ver_range = f"Z{row_num}" # Version + update_range = f"J{row_num}:O{row_num}" + dt_range = f"Y{row_num}" + ver_range = f"Z{row_num}" print(f"\n[{datetime.now().strftime('%H:%M:%S')}] Verarbeite Zeile {row_num}: {company_name}") article = self.wiki_scraper.search_company_article(company_name, website) if article: company_data = self.wiki_scraper.extract_company_data(article.url) else: company_data = {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', - 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'} + 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'} self.sheet_handler.sheet.update(values=[[ company_data.get('url', 'k.A.'), company_data.get('first_paragraph', 'k.A.'), company_data.get('branche', 'k.A.'), company_data.get('umsatz', 'k.A.'), - company_data.get('mitarbeiter', 'k.A.') + company_data.get('mitarbeiter', 'k.A.'), + company_data.get('categories', 'k.A.') ]], range_name=update_range) current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_range) self.sheet_handler.sheet.update(values=[[Config.VERSION]], range_name=ver_range) - print(f"✅ Aktualisiert: URL: {company_data.get('url', 'k.A.')}, Erster Absatz: {company_data.get('first_paragraph', 'k.A.')[:30]}..., Branche: {company_data.get('branche', 'k.A.')}, Umsatz: {company_data.get('umsatz', 'k.A.')}, Mitarbeiter: {company_data.get('mitarbeiter', 'k.A.')}") + print(f"✅ Aktualisiert: URL: {company_data.get('url', 'k.A.')}, Absatz: {company_data.get('first_paragraph', 'k.A.')[:30]}..., Branche: {company_data.get('branche', 'k.A.')}, Umsatz: {company_data.get('umsatz', 'k.A.')}, Mitarbeiter: {company_data.get('mitarbeiter', 'k.A.')}, Kategorien: {company_data.get('categories', 'k.A.')}") if MODE == "2": print("----- Vollständiger Infobox-Inhalt -----") print(company_data.get("full_infobox", "k.A.")) @@ -399,4 +411,4 @@ if __name__ == "__main__": num_rows = None processor = DataProcessor() processor.process_rows(num_rows) - print("\n✅ Wikipedia-Auswertung abgeschlossen (v1.2.0)") + print(f"\n✅ Wikipedia-Auswertung abgeschlossen ({Config.VERSION})")