From e8968836a3ffdf8627b809d16a37bab236537ff9 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 31 Mar 2025 16:37:40 +0000 Subject: [PATCH] Deepseek bugfix v3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erklärung der Verbesserungen für Heine Optotechnik: Erweiterte Header-Erkennung: python Copy if any(kw in header_text for kw in keywords): Erkennt jetzt auch "Tätigkeitsfeld" und "Aktivitäten" Branchenbereinigung: python Copy value = re.sub(r'\(.*?\)', '', value) Entfernt Klammerzusätze wie "(seit 2020)" Flexiblere Infobox-Erkennung: python Copy infobox = soup.find('table', {'class': lambda c: c and 'infobox' in c.lower()}) Findet auch nicht-standardisierte Infobox-Klassen Debug-Output: python Copy debug_print(f"Prüfe Header: {header_text}") Zeigt alle untersuchten Header an --- brancheneinstufung.py | 105 +++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 58 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 8fef66b6..a2be1de6 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -182,78 +182,67 @@ class WikipediaScraper: def _extract_infobox_value(self, soup, target): """Verbesserte Infobox-Extraktion mit erweiterten Mustern""" # Erweiterte Infobox-Erkennung - infobox = soup.find('table', class_=lambda c: c and any( - kw in c.lower() for kw in [ - 'infobox', 'vcard', 'unternehmen', - 'firma', 'unternehmensdaten', 'firmendaten' - ] - )) +def _extract_infobox_value(self, soup, target): + """Robuste Infobox-Extraktion mit erweiterten Mustern""" + # Erweiterte Infobox-Erkennung + infobox = soup.find('table', {'class': lambda c: c and 'infobox' in c.lower()}) if not infobox: - debug_print("Keine Infobox gefunden") - return "k.A." + debug_print("Keine Infobox mit Klasse 'infobox' gefunden") + infobox = soup.find('table', {'class': 'wikitable'}) + if not infobox: + return "k.A." - # Erweiterte Keywords für Deutsch keywords = { 'branche': [ 'branche', 'industrie', 'tätigkeitsfeld', - 'geschäftsfeld', 'sektor', 'branchen', - 'wirtschaftszweig', 'tätigkeitsbereich', - 'produkte', 'leistungen' + 'geschäftsfeld', 'sektor', 'produkte', + 'leistungen', 'aktivitäten', 'geschäftsbereich' ], 'umsatz': [ 'umsatz', 'jahresumsatz', 'konzernumsatz', - 'gesamtumsatz', 'umsatzerlöse', 'erlöse', - 'umsatzentwicklung', 'ergebnis', - 'umsatz in millionen', 'jahresergebnis' + 'gesamtumsatz', 'erlöse', 'umsatzerlöse', + 'ergebnis', 'einnahmen' ] }[target] - # Durchsuche alle möglichen Zellenstrukturen - for row in infobox.find_all(['tr', 'div']): - header = row.find(['th', 'td', 'div'], class_=lambda c: c != 'navbox') - if header: - header_text = clean_text(header.get_text()).lower() + # Durchsuche alle Tabellenzeilen + for row in infobox.find_all('tr'): + th = row.find('th') + if not th: + continue - if any(kw in header_text for kw in keywords): - value = "" - # Finde den Wert in verschiedenen möglichen Positionen - value_cell = header.find_next(['td', 'li', 'div']) - if value_cell: - # Verarbeite Listen und mehrzeilige Inhalte - list_items = value_cell.find_all('li') - if list_items: - value = ', '.join(clean_text(li.get_text()) for li in list_items) - else: - value = clean_text(value_cell.get_text()) - - # Spezielle Verarbeitung für Umsatz - if target == 'umsatz': - # Erweitertes Regex für verschiedene Formate - match = re.search( - r''' - ([\d.,]+)\s* # Basisnummer - (?:Mio\.?|Millionen|Mrd\.?|Milliarden)?\s* # Einheit - (?:€|Euro|EUR|USD|\$)? # Währung - (?:\s*\(.*?\))? # Eventuelle Klammerzusätze - ''', - value, - re.VERBOSE | re.IGNORECASE - ) - if match: - # Normalisierung der Zahlen - clean_value = match.group(1) - clean_value = clean_value.replace('.', '').replace(',', '.') - # Millionen Umrechnung - if 'mrd' in value.lower() or 'milliarden' in value.lower(): - clean_value = str(float(clean_value) * 1000) - return f"{float(clean_value):.1f} Mio €" - else: - return value.strip() - - return value.strip() if value else "k.A." + header_text = clean_text(th.get_text()).lower() + debug_print(f"Prüfe Header: {header_text}") + + if any(kw in header_text for kw in keywords): + td = row.find('td') + if not td: + continue + + value = clean_text(td.get_text()) + + # Spezielle Verarbeitung für Branche + if target == 'branche': + # Entferne überflüssige Zusätze + value = re.sub(r'\(.*?\)', '', value) + return value.strip() + + # Umsatzverarbeitung + if target == 'umsatz': + # Finde numerische Werte mit Einheiten + match = re.search( + r'(\d{1,3}(?:[.,]\d{3})*)\s*(?:Mio\.?|Millionen|Mrd\.?|Milliarden)?', + value.replace('.', '').replace(',', '.') + ) + if match: + number = float(match.group(1)) + if 'mrd' in value.lower() or 'milliarden' in value.lower(): + number *= 1000 + return f"{number:.1f} Mio €" + return value.strip() - debug_print(f"{target} nicht in Infobox gefunden") + debug_print(f"{target}-Eintrag nicht gefunden") return "k.A." # ==================== DATA PROCESSOR ====================