v1.2.3: Updated alignment demo and extraction ranges per new schema (K:Q for Wiki data, AH for Times

Zusammenfassung der Änderungen (v1.2.2 → v1.2.3)
Neues Spaltenschema:
Die neue Spaltenzuordnung wurde gemäß der CSV-Vorlage umgesetzt. Die relevanten Felder aus Wikipedia werden jetzt in:

Spalte K: Vorschlag Wiki URL (Platzhalter "k.A.")

Spalte L: Wikipedia URL

Spalte M: Wikipedia Absatz

Spalte N: Wikipedia Branche

Spalte O: Wikipedia Umsatz

Spalte P: Wikipedia Mitarbeiter

Spalte Q: Wikipedia Kategorien
geschrieben.

Timestamp & Version:
Der Timestamp wird in Spalte AH und die Version in Spalte AI aktualisiert.

Alignment-Demo:
Der Alignment-Demo-Modus (Option 3) schreibt nun die neuen Spaltenüberschriften in den Range A11200:AI11200 (34 Spalten entsprechend dem neuen Schema).
This commit is contained in:
2025-04-01 16:30:03 +00:00
parent be0feb4508
commit 0ed557d37b

View File

@@ -13,7 +13,7 @@ import csv
# ==================== KONFIGURATION ==================== # ==================== KONFIGURATION ====================
class Config: class Config:
VERSION = "v1.2.2" # v1.2.2: Neue Spaltenzuordnung & Wikipedia-Kategorien extrahieren VERSION = "v1.2.3" # v1.2.3: Neue Spaltenzuordnung gemäß dem neuen Schema, Wikipedia-Kategorien extrahieren
LANG = "de" LANG = "de"
CREDENTIALS_FILE = "service_account.json" CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -143,26 +143,35 @@ def alignment_demo(sheet):
"Spalte F (Aktuelle Branche)", "Spalte F (Aktuelle Branche)",
"Spalte G (Beschreibung Branche extern)", "Spalte G (Beschreibung Branche extern)",
"Spalte H (Anzahl Techniker CRM)", "Spalte H (Anzahl Techniker CRM)",
"Spalte I (Vorschlag Wiki URL)", "Spalte I (Umsatz CRM)",
"Spalte J (Wikipedia URL)", "Spalte J (Anzahl Mitarbeiter CRM)",
"Spalte K (Wikipedia Absatz)", "Spalte K (Vorschlag Wiki URL)",
"Spalte L (Wikipedia Branche)", "Spalte L (Wikipedia URL)",
"Spalte M (Wikipedia Umsatz)", "Spalte M (Wikipedia Absatz)",
"Spalte N (Wikipedia Mitarbeiter)", "Spalte N (Wikipedia Branche)",
"Spalte O (Wikipedia Kategorien)", "Spalte O (Wikipedia Umsatz)",
"Spalte P (Konsistenzprüfung)", "Spalte P (Wikipedia Mitarbeiter)",
"Spalte Q (Begründung bei Inkonsistenz)", "Spalte Q (Wikipedia Kategorien)",
"Spalte R (Vorschlag Wiki Artikel ChatGPT)", "Spalte R (Konsistenzprüfung)",
"Spalte S (FSM Relevanz Ja / Nein)", "Spalte S (Begründung bei Inkonsistenz)",
"Spalte T (Begründung für FSM Relevanz)", "Spalte T (Vorschlag Wiki Artikel ChatGPT)",
"Spalte U (Schätzung Anzahl Mitarbeiter)", "Spalte U (Begründung bei Abweichung)",
"Spalte V (Begründung bei Abweichung)", "Spalte V (Vorschlag neue Branche)",
"Spalte W (Einschätzung Anzahl Servicetechniker)", "Spalte W (Konsistenzprüfung Branche)",
"Spalte X (Begründung bei Abweichung Anzahl Servicetechniker)", "Spalte X (Begründung Abweichung Branche)",
"Spalte Y (Timestamp letzte Prüfung)", "Spalte Y (FSM Relevanz Ja / Nein)",
"Spalte Z (Version)" "Spalte Z (Begründung für FSM Relevanz)",
"Spalte AA (Schätzung Anzahl Mitarbeiter)",
"Spalte AB (Konsistenzprüfung Mitarbeiterzahl)",
"Spalte AC (Begründung für Abweichung Mitarbeiterzahl)",
"Spalte AD (Einschätzung Anzahl Servicetechniker)",
"Spalte AE (Begründung bei Abweichung Anzahl Servicetechniker)",
"Spalte AF (Schätzung Umsatz ChatGPT)",
"Spalte AG (Begründung für Abweichung Umsatz)",
"Spalte AH (Timestamp letzte Prüfung)",
"Spalte AI (Version)"
] ]
header_range = "A11200:Z11200" header_range = "A11200:AI11200" # 35 Spalten: A bis AI
sheet.update(values=[new_headers], range_name=header_range) sheet.update(values=[new_headers], range_name=header_range)
print("Alignment-Demo abgeschlossen: Neue Spaltenüberschriften in Zeile 11200 geschrieben.") print("Alignment-Demo abgeschlossen: Neue Spaltenüberschriften in Zeile 11200 geschrieben.")
@@ -236,7 +245,7 @@ class WikipediaScraper:
debug_print(f"Fehler beim Extrahieren des ersten Absatzes: {e}") debug_print(f"Fehler beim Extrahieren des ersten Absatzes: {e}")
return "k.A." return "k.A."
def extract_categories(self, soup): def extract_categories(self, soup):
"""Extrahiert Wikipedia-Kategorien als kommagetrennte Liste.""" """Extrahiert Wikipedia-Kategorien als kommagetrennten String."""
cat_div = soup.find('div', id="mw-normal-catlinks") cat_div = soup.find('div', id="mw-normal-catlinks")
if cat_div: if cat_div:
ul = cat_div.find('ul') ul = cat_div.find('ul')
@@ -359,29 +368,40 @@ class DataProcessor:
self._process_single_row(i, row) self._process_single_row(i, row)
def _process_single_row(self, row_num, row_data): def _process_single_row(self, row_num, row_data):
# Im neuen Schema: Firmenname in Spalte B (Index 1), Website in Spalte C (Index 2). # Im neuen Schema: Firmenname in Spalte B (Index 1), Website in Spalte C (Index 2).
# Wikipedia-Daten werden in Spalten J bis O geschrieben: # Wikipedia-Daten werden in Spalten K bis Q geschrieben:
# J: Wikipedia URL, K: Wikipedia Absatz, L: Wikipedia Branche, M: Wikipedia Umsatz, N: Wikipedia Mitarbeiter, O: Wikipedia Kategorien. # K: Vorschlag Wiki URL, L: Wikipedia URL, M: Wikipedia Absatz, N: Wikipedia Branche,
# Timestamp (jetzt) in Spalte Y und Version in Spalte Z. # O: Wikipedia Umsatz, P: Wikipedia Mitarbeiter, Q: Wikipedia Kategorien.
# Timestamp (jetzt) in Spalte AH, Version in Spalte AI.
company_name = row_data[1] if len(row_data) > 1 else "" company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else "" website = row_data[2] if len(row_data) > 2 else ""
update_range = f"J{row_num}:O{row_num}" update_range = f"K{row_num}:Q{row_num}"
dt_range = f"Y{row_num}" dt_range = f"AH{row_num}"
ver_range = f"Z{row_num}" ver_range = f"AI{row_num}"
print(f"\n[{datetime.now().strftime('%H:%M:%S')}] Verarbeite Zeile {row_num}: {company_name}") 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) article = self.wiki_scraper.search_company_article(company_name, website)
if article: if article:
company_data = self.wiki_scraper.extract_company_data(article.url) company_data = self.wiki_scraper.extract_company_data(article.url)
else: else:
company_data = {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', company_data = {
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'} 'url': 'k.A.',
self.sheet_handler.sheet.update(values=[[ 'first_paragraph': 'k.A.',
'branche': 'k.A.',
'umsatz': 'k.A.',
'mitarbeiter': 'k.A.',
'categories': 'k.A.',
'full_infobox': 'k.A.'
}
# Für Vorschlag Wiki URL setzen wir zunächst "k.A." als Platzhalter.
values = [
"k.A.", # Vorschlag Wiki URL
company_data.get('url', 'k.A.'), company_data.get('url', 'k.A.'),
company_data.get('first_paragraph', 'k.A.'), company_data.get('first_paragraph', 'k.A.'),
company_data.get('branche', 'k.A.'), company_data.get('branche', 'k.A.'),
company_data.get('umsatz', '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.') company_data.get('categories', 'k.A.')
]], range_name=update_range) ]
self.sheet_handler.sheet.update(values=[values], range_name=update_range)
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S") 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=[[current_dt]], range_name=dt_range)
self.sheet_handler.sheet.update(values=[[Config.VERSION]], range_name=ver_range) self.sheet_handler.sheet.update(values=[[Config.VERSION]], range_name=ver_range)