infobox bugfix
Erweiterte Infobox-Erkennung: Unterstützt jetzt zusätzliche Klassen wie firma und unternehmensdaten Berücksichtigt div-Elemente neben Tabellenzeilen Verbesserte Schlüsselwörter: 50% mehr Keywords für Branchen- und Umsatzfelder Berücksichtigt typisch deutsche Formulierungen Flexible Wertextraktion: Verarbeitet Listen (<li>-Elemente) Ignoriert Navigationsboxen (navbox-Klasse) Sucht in verschiedenen HTML-Elementen (div, td, th) Robuste Umsatzanalyse: Erkennt verschiedene Schreibweisen: "123,45 Mio. €" "1.234,56 Millionen Euro" "5,6 Mrd. USD" Führt automatische Umrechnung durch: 1 Milliarde → 1000 Millionen Standardisiert die Ausgabe auf "X.X Mio €" Erweiterte Debug-Informationen: Protokolliert fehlgeschlagene Suchvorgänge Zeigt erkannte Werte im Rohformat an
This commit is contained in:
@@ -179,38 +179,81 @@ 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):
|
||||||
"""Robuste Infobox-Analyse"""
|
"""Verbesserte Infobox-Extraktion mit erweiterten Mustern"""
|
||||||
|
# Erweiterte Infobox-Erkennung
|
||||||
infobox = soup.find('table', class_=lambda c: c and any(
|
infobox = soup.find('table', class_=lambda c: c and any(
|
||||||
kw in c.lower() for kw in ['infobox', 'vcard', 'unternehmen']
|
kw in c.lower() for kw in [
|
||||||
|
'infobox', 'vcard', 'unternehmen',
|
||||||
|
'firma', 'unternehmensdaten', 'firmendaten'
|
||||||
|
]
|
||||||
))
|
))
|
||||||
|
|
||||||
if not infobox:
|
if not infobox:
|
||||||
|
debug_print("Keine Infobox gefunden")
|
||||||
return "k.A."
|
return "k.A."
|
||||||
|
|
||||||
|
# Erweiterte Keywords für Deutsch
|
||||||
keywords = {
|
keywords = {
|
||||||
'branche': ['branche', 'industrie', 'tätigkeitsfeld', 'geschäftsfeld'],
|
'branche': [
|
||||||
'umsatz': ['umsatz', 'jahresumsatz', 'konzernumsatz', 'erlöse']
|
'branche', 'industrie', 'tätigkeitsfeld',
|
||||||
|
'geschäftsfeld', 'sektor', 'branchen',
|
||||||
|
'wirtschaftszweig', 'tätigkeitsbereich',
|
||||||
|
'produkte', 'leistungen'
|
||||||
|
],
|
||||||
|
'umsatz': [
|
||||||
|
'umsatz', 'jahresumsatz', 'konzernumsatz',
|
||||||
|
'gesamtumsatz', 'umsatzerlöse', 'erlöse',
|
||||||
|
'umsatzentwicklung', 'ergebnis',
|
||||||
|
'umsatz in millionen', 'jahresergebnis'
|
||||||
|
]
|
||||||
}[target]
|
}[target]
|
||||||
|
|
||||||
for row in infobox.find_all('tr'):
|
# Durchsuche alle möglichen Zellenstrukturen
|
||||||
header = row.find('th')
|
for row in infobox.find_all(['tr', 'div']):
|
||||||
|
header = row.find(['th', 'td', 'div'], class_=lambda c: c != 'navbox')
|
||||||
if header:
|
if header:
|
||||||
header_text = clean_text(header.get_text()).lower()
|
header_text = clean_text(header.get_text()).lower()
|
||||||
if any(kw in header_text for kw in keywords):
|
|
||||||
value = row.find('td')
|
|
||||||
if value:
|
|
||||||
raw_value = clean_text(value.get_text())
|
|
||||||
|
|
||||||
# Umsatzbereinigung
|
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':
|
if target == 'umsatz':
|
||||||
|
# Erweitertes Regex für verschiedene Formate
|
||||||
match = re.search(
|
match = re.search(
|
||||||
r'(\d{1,3}(?:[.,]\d{3})*)\s*(?:Mio\.?|Millionen|Mrd\.?|Milliarden)?',
|
r'''
|
||||||
raw_value
|
([\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:
|
if match:
|
||||||
return match.group(1).replace('.', '').replace(',', '.')
|
# Normalisierung der Zahlen
|
||||||
return raw_value
|
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."
|
||||||
|
|
||||||
|
debug_print(f"{target} nicht in Infobox gefunden")
|
||||||
return "k.A."
|
return "k.A."
|
||||||
|
|
||||||
# ==================== DATA PROCESSOR ====================
|
# ==================== DATA PROCESSOR ====================
|
||||||
|
|||||||
Reference in New Issue
Block a user