deepseek V7

Vollständige Implementierung der _extract_infobox_value-Methode

Erweiterte Schlüsselwörter für deutsche Infoboxen

Verbesserte Textbereinigung für Branchenangaben

Toleranz für verschiedene Zahlenformate

Debug-Output für jeden Verarbeitungsschritt
This commit is contained in:
2025-03-31 16:45:02 +00:00
parent e8968836a3
commit eecbf383b5

View File

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