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:
@@ -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 ====================
|
||||
|
||||
Reference in New Issue
Block a user