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:
@@ -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()
|
if any(kw in header_text for kw in keywords):
|
||||||
debug_print(f"Prüfe Header: {header_text}")
|
value_cell = row.find('td')
|
||||||
|
if value_cell:
|
||||||
|
value = clean_text(value_cell.get_text())
|
||||||
|
|
||||||
if any(kw in header_text for kw in keywords):
|
# Branchenbereinigung
|
||||||
td = row.find('td')
|
if target == 'branche':
|
||||||
if not td:
|
# Entferne Klammerzusätze und Formatierungen
|
||||||
continue
|
value = re.sub(r'\[.*?\]|\(.*?\)', '', value)
|
||||||
|
return ' '.join(value.split()).strip()
|
||||||
|
|
||||||
value = clean_text(td.get_text())
|
# 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()
|
||||||
|
|
||||||
# Spezielle Verarbeitung für Branche
|
debug_print(f"{target} nicht gefunden")
|
||||||
if target == 'branche':
|
return "k.A."
|
||||||
# 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."
|
|
||||||
|
|
||||||
# ==================== DATA PROCESSOR ====================
|
# ==================== DATA PROCESSOR ====================
|
||||||
class DataProcessor:
|
class DataProcessor:
|
||||||
|
|||||||
Reference in New Issue
Block a user