Deepseek bugfix v3

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
This commit is contained in:
2025-03-31 16:37:40 +00:00
parent f665612146
commit e8968836a3

View File

@@ -182,78 +182,67 @@ class WikipediaScraper:
def _extract_infobox_value(self, soup, target): def _extract_infobox_value(self, soup, target):
"""Verbesserte Infobox-Extraktion mit erweiterten Mustern""" """Verbesserte Infobox-Extraktion mit erweiterten Mustern"""
# Erweiterte Infobox-Erkennung # Erweiterte Infobox-Erkennung
infobox = soup.find('table', class_=lambda c: c and any( def _extract_infobox_value(self, soup, target):
kw in c.lower() for kw in [ """Robuste Infobox-Extraktion mit erweiterten Mustern"""
'infobox', 'vcard', 'unternehmen', # Erweiterte Infobox-Erkennung
'firma', 'unternehmensdaten', 'firmendaten' infobox = soup.find('table', {'class': lambda c: c and 'infobox' in c.lower()})
]
))
if not infobox: if not infobox:
debug_print("Keine Infobox gefunden") debug_print("Keine Infobox mit Klasse 'infobox' gefunden")
return "k.A." infobox = soup.find('table', {'class': 'wikitable'})
if not infobox:
return "k.A."
# Erweiterte Keywords für Deutsch
keywords = { keywords = {
'branche': [ 'branche': [
'branche', 'industrie', 'tätigkeitsfeld', 'branche', 'industrie', 'tätigkeitsfeld',
'geschäftsfeld', 'sektor', 'branchen', 'geschäftsfeld', 'sektor', 'produkte',
'wirtschaftszweig', 'tätigkeitsbereich', 'leistungen', 'aktivitäten', 'geschäftsbereich'
'produkte', 'leistungen'
], ],
'umsatz': [ 'umsatz': [
'umsatz', 'jahresumsatz', 'konzernumsatz', 'umsatz', 'jahresumsatz', 'konzernumsatz',
'gesamtumsatz', 'umsatzerlöse', 'erlöse', 'gesamtumsatz', 'erlöse', 'umsatzerlöse',
'umsatzentwicklung', 'ergebnis', 'ergebnis', 'einnahmen'
'umsatz in millionen', 'jahresergebnis'
] ]
}[target] }[target]
# Durchsuche alle möglichen Zellenstrukturen # Durchsuche alle Tabellenzeilen
for row in infobox.find_all(['tr', 'div']): for row in infobox.find_all('tr'):
header = row.find(['th', 'td', 'div'], class_=lambda c: c != 'navbox') th = row.find('th')
if header: if not th:
header_text = clean_text(header.get_text()).lower() continue
if any(kw in header_text for kw in keywords): header_text = clean_text(th.get_text()).lower()
value = "" debug_print(f"Prüfe Header: {header_text}")
# Finde den Wert in verschiedenen möglichen Positionen
value_cell = header.find_next(['td', 'li', 'div']) if any(kw in header_text for kw in keywords):
if value_cell: td = row.find('td')
# Verarbeite Listen und mehrzeilige Inhalte if not td:
list_items = value_cell.find_all('li') continue
if list_items:
value = ', '.join(clean_text(li.get_text()) for li in list_items) value = clean_text(td.get_text())
else:
value = clean_text(value_cell.get_text()) # Spezielle Verarbeitung für Branche
if target == 'branche':
# Spezielle Verarbeitung für Umsatz # Entferne überflüssige Zusätze
if target == 'umsatz': value = re.sub(r'\(.*?\)', '', value)
# Erweitertes Regex für verschiedene Formate return value.strip()
match = re.search(
r''' # Umsatzverarbeitung
([\d.,]+)\s* # Basisnummer if target == 'umsatz':
(?:Mio\.?|Millionen|Mrd\.?|Milliarden)?\s* # Einheit # Finde numerische Werte mit Einheiten
(?:€|Euro|EUR|USD|\$)? # Währung match = re.search(
(?:\s*\(.*?\))? # Eventuelle Klammerzusätze r'(\d{1,3}(?:[.,]\d{3})*)\s*(?:Mio\.?|Millionen|Mrd\.?|Milliarden)?',
''', value.replace('.', '').replace(',', '.')
value, )
re.VERBOSE | re.IGNORECASE if match:
) number = float(match.group(1))
if match: if 'mrd' in value.lower() or 'milliarden' in value.lower():
# Normalisierung der Zahlen number *= 1000
clean_value = match.group(1) return f"{number:.1f} Mio €"
clean_value = clean_value.replace('.', '').replace(',', '.') return value.strip()
# 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."
debug_print(f"{target} nicht in Infobox gefunden") debug_print(f"{target}-Eintrag nicht gefunden")
return "k.A." return "k.A."
# ==================== DATA PROCESSOR ==================== # ==================== DATA PROCESSOR ====================