diff --git a/brancheneinstufung.py b/brancheneinstufung.py index a2be1de6..3a5457e9 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -179,71 +179,72 @@ class WikipediaScraper: debug_print(f"Extraktionsfehler: {str(e)}") return {'branche': 'k.A.', 'umsatz': 'k.A.', 'url': page_url} -def _extract_infobox_value(self, soup, target): - """Verbesserte Infobox-Extraktion mit erweiterten Mustern""" - # Erweiterte Infobox-Erkennung -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 mit Klasse 'infobox' gefunden") - infobox = soup.find('table', {'class': 'wikitable'}) + def _extract_infobox_value(self, soup, target): + """Robuste Infobox-Extraktion mit erweiterten Mustern""" + debug_print(f"Starte Extraktion für: {target}") + + # Erweiterte Infobox-Erkennung + infobox = soup.find('table', class_=lambda c: c and any( + kw in c.lower() for kw in ['infobox', 'vcard', 'unternehmen', 'firmendaten'] + )) + if not infobox: + debug_print("Keine Infobox gefunden") return "k.A." - keywords = { - 'branche': [ - 'branche', 'industrie', 'tätigkeitsfeld', - 'geschäftsfeld', 'sektor', 'produkte', - 'leistungen', 'aktivitäten', 'geschäftsbereich' - ], - 'umsatz': [ - 'umsatz', 'jahresumsatz', 'konzernumsatz', - 'gesamtumsatz', 'erlöse', 'umsatzerlöse', - 'ergebnis', 'einnahmen' - ] - }[target] + # Erweiterte Keywords für Deutsch + keywords = { + 'branche': [ + 'branche', 'industrie', 'tätigkeitsfeld', + 'geschäftsfeld', 'sektor', 'branchen', + 'wirtschaftszweig', 'tätigkeitsbereich', + 'produkte', 'leistungen', 'aktivität' + ], + 'umsatz': [ + 'umsatz', 'jahresumsatz', 'konzernumsatz', + 'gesamtumsatz', 'umsatzerlöse', 'erlöse', + 'umsatzentwicklung', 'ergebnis', + 'einnahmen', 'jahresergebnis' + ] + }[target] - # Durchsuche alle Tabellenzeilen - for row in infobox.find_all('tr'): - th = row.find('th') - if not th: - continue - - 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 + # Durchsuche alle Tabellenzeilen + for row in infobox.find_all('tr'): + header = row.find('th') + if header: + header_text = clean_text(header.get_text()).lower() + debug_print(f"Prüfe Header: {header_text}") - 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}-Eintrag nicht gefunden") - return "k.A." + if any(kw in header_text for kw in keywords): + value_cell = row.find('td') + if value_cell: + value = clean_text(value_cell.get_text()) + + # Branchenbereinigung + if target == 'branche': + # Entferne Klammerzusätze und Formatierungen + value = re.sub(r'\[.*?\]|\(.*?\)', '', value) + return ' '.join(value.split()).strip() + + # Umsatzbereinigung + if target == 'umsatz': + # Finde numerische Werte + match = re.search( + r'(\d{1,3}(?:[.,]\d{3})*)\s*' + r'(?:Mio\.?|Millionen|Mrd\.?|Milliarden)?\s*' + r'(?:€|Euro|EUR)?', + value.replace('.', '').replace(',', '.'), + re.IGNORECASE + ) + if match: + num_value = float(match.group(1)) + if 'mrd' in value.lower() or 'milliarden' in value.lower(): + num_value *= 1000 + return f"{num_value:.1f} Mio €" + return value.strip() + + debug_print(f"{target} nicht gefunden") + return "k.A." # ==================== DATA PROCESSOR ==================== class DataProcessor: