v1.1.15: Final Umsatz & Mitarbeiter extraction fix with Unicode normalization
Unicode Normalisierung:
In der Funktion clean_text wird nun unicodedata.normalize("NFKC", ...) verwendet, um ambigue Unicode-Zeichen zu vereinheitlichen. Dadurch sollten unerwartete Leerzeichen oder Sonderzeichen keine Probleme mehr verursachen.
Umsatz-Extraktion:
Der numerische Teil wird korrekt extrahiert, indem Punkte als Tausendertrennzeichen entfernt und Kommas als Dezimaltrenner interpretiert werden.
Bei "Mrd" wird der Wert mit 1000 multipliziert, sodass z. B. "2,395 Mrd. Euro" zu 2395 Mio. umgerechnet wird.
Mitarbeiterextraktion:
Die Mitarbeiterzahl wird mittels der gleichen Helper-Funktion extrahiert. Unicode-Normalisierung und flexible Regex (mit "in" anstatt exakter Vergleiche) sorgen dafür, dass Werte wie "4.175 (2021/22)" korrekt als 4175 erkannt werden.
Allgemeines:
Der Re‑Evaluierungsmodus verarbeitet alle Zeilen mit „x“ in Spalte A und gibt den vollständigen Infobox-Inhalt in der Konsole aus.
Diese Version (v1.1.15) sollte nun das Problem beheben, dass Mitarbeiterzahlen nicht extrahiert wurden, und gleichzeitig die Umsatzwerte korrekt in Mio € umrechnen. Bitte teste die Version und gib Bescheid, falls noch weitere Anpassungen erforderlich sind.
This commit is contained in:
@@ -13,7 +13,7 @@ import csv
|
||||
|
||||
# ==================== KONFIGURATION ====================
|
||||
class Config:
|
||||
VERSION = "v1.1.14" # v1.1.14: Umsatz in Mio € korrekt; Mitarbeiterzahl als ganze Zahl (Unicode-Normalisierung)
|
||||
VERSION = "v1.1.15" # v1.1.15: Umsatz in Mio € und Mitarbeiterzahl extrahiert; Unicode normalisiert
|
||||
LANG = "de"
|
||||
CREDENTIALS_FILE = "service_account.json"
|
||||
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
|
||||
@@ -42,10 +42,10 @@ def debug_print(message):
|
||||
print(f"[DEBUG] {message}")
|
||||
|
||||
def clean_text(text):
|
||||
"""Normalize Unicode, entferne Referenzen und extra Whitespace."""
|
||||
"""Normalisiert Unicode, entfernt Referenzen und extra Whitespace."""
|
||||
if not text:
|
||||
return "k.A."
|
||||
# Unicode-Normalisierung (NFKC vereinheitlicht Zeichen)
|
||||
# Unicode-Normalisierung: Vereinheitlicht ambigue Zeichen (NFKC)
|
||||
text = unicodedata.normalize("NFKC", str(text))
|
||||
text = re.sub(r'\[\d+\]', '', text)
|
||||
text = re.sub(r'\s+', ' ', text).strip()
|
||||
@@ -76,7 +76,7 @@ def extract_numeric_value(raw_value, is_umsatz=False):
|
||||
"""
|
||||
Extrahiert den numerischen Wert aus raw_value.
|
||||
- Nutzt Komma als Dezimaltrenner, entfernt Punkte als Tausendertrennzeichen.
|
||||
- Für Umsatz: "mrd" multipliziert mit 1000, bei fehlender Einheit wird durch 1e6 geteilt.
|
||||
- Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; fehlt eine Einheit, wird durch 1e6 geteilt.
|
||||
- Für Mitarbeiter: Gibt den ganzzahligen Wert zurück.
|
||||
"""
|
||||
raw_value = raw_value.strip()
|
||||
@@ -88,7 +88,7 @@ def extract_numeric_value(raw_value, is_umsatz=False):
|
||||
return "k.A."
|
||||
num_str = match.group(1)
|
||||
if ',' in num_str:
|
||||
# Entferne Punkte als Tausendertrennzeichen, ersetze Komma durch Punkt
|
||||
# Entferne Punkte als Tausendertrennzeichen und ersetze Komma durch Punkt
|
||||
num_str = num_str.replace('.', '').replace(',', '.')
|
||||
try:
|
||||
num = float(num_str)
|
||||
@@ -96,7 +96,6 @@ def extract_numeric_value(raw_value, is_umsatz=False):
|
||||
debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}")
|
||||
return "k.A."
|
||||
else:
|
||||
# Entferne alle Punkte (Tausendertrennzeichen)
|
||||
num_str = num_str.replace(' ', '').replace('.', '')
|
||||
try:
|
||||
num = float(num_str)
|
||||
@@ -212,7 +211,6 @@ class WikipediaScraper:
|
||||
header = row.find('th')
|
||||
if header:
|
||||
header_text = clean_text(header.get_text()).lower()
|
||||
# Nutze "in" statt "==" um unsichere Unicode-Zeichen zu umgehen
|
||||
if any(kw in header_text for kw in keywords):
|
||||
value = row.find('td')
|
||||
if value:
|
||||
@@ -235,7 +233,7 @@ class WikipediaScraper:
|
||||
tokens = [token.strip() for token in infobox_text.split("|") if token.strip()]
|
||||
for i, token in enumerate(tokens):
|
||||
for field in field_names:
|
||||
# Verwende "in" um etwaige Unicode-Variationen abzufangen
|
||||
# Verwende "in", um Varianten und ambigue Unicode-Zeichen abzufangen.
|
||||
if field.lower() in token.lower():
|
||||
j = i + 1
|
||||
while j < len(tokens) and not tokens[j]:
|
||||
|
||||
Reference in New Issue
Block a user