Hallo ich habe die Dax-Kurse von folgender Seite mit Python/Selenium/Pandas gescraped:
https://www.boerse-frankfurt.de/index/dax/kurshistorie/historische-kurse-und-umsaetze
Mann muss die Seite kurze einstellen, sonst sieht man nicht worum es geht: Cookies ja und:
1. Bei "Nach Datum auflisten" dann "von": "1.1.1988" bis "15.1.1988". Und ja das "von Datum" spielt eine Rolle um den Fehler zu verstehen. "Bis" sollte einfach ein kurzer Zeitraum von 2-3 Wochen sein.
2. Auf "historische Kurse anzeigen" klicken, und kurz warten die Seite braucht 1-2 Sekunden.
Der Fehler ist nun dass in den gescrapedten Daten Alle Zahlen unter 1000 das Komma gelöscht wird und sie dadurch viel zu groß werden in Notepad++ sieht das dann so aus:
Mit viel Testen konnte der Fehler auf die fett markierte Zeile eingegrenzt werden also Pandas read_html Methode.
lässt man sich mit enumerate den Inhalt und Typ von tables anzeigen:
Die Werte sind zwar als string eingelesen aber die Zahlen kleiner tausend haben von Pandas fälschlicherweise das Komma gelöscht bekommen.
Weiß dazu jemand mehr warum Pandas bei europäischem Zahlenformat diesen Fehler hat und wie könnte man den umgehen?
Woher wissen wir denn das Selenium-Response-Objekt "html" nicht schon falsch ist?
Der ganze Code ist etwas zu ausführlich zum hier Posten.
Ich habe aber das gescrapde Responseobjekt, bytegenau auf die Platte geschrieben und Euch angehängt. Anstatt die ganzen Einstellungen die notwendig sind bis das Webscraping läuft könnt ihr Euch einfach das Endprodukt der ganzen Mühen anschauen/einlesen. Ich konnte nur keine ".html" Dateien hier im Forum posten ihr müsst die Endung in "html" ändern.
Wenn ihr Euch da die Zahlen raussuchen wollt
Die "1000,00" vom 1.1.1988 hat als "Copy Element":
<td _ngcontent-boerse-frankfurt-c352035757="" class="widget-table-cell text-end"> 1.000,00</td>
Die 943,88:
<td _ngcontent-boerse-frankfurt-c352035757="" class="widget-table-cell text-end"> 943,88</td>
Ich habe die Zahlen auch mittels:
https://www.babelstone.co.uk/Unicode/whatisit.html
verglichen aber sie sehen identisch codiert aus. Sieht also nach einem harten Fehler in Pandas read_html aus.
https://www.boerse-frankfurt.de/index/dax/kurshistorie/historische-kurse-und-umsaetze
Mann muss die Seite kurze einstellen, sonst sieht man nicht worum es geht: Cookies ja und:
1. Bei "Nach Datum auflisten" dann "von": "1.1.1988" bis "15.1.1988". Und ja das "von Datum" spielt eine Rolle um den Fehler zu verstehen. "Bis" sollte einfach ein kurzer Zeitraum von 2-3 Wochen sein.
2. Auf "historische Kurse anzeigen" klicken, und kurz warten die Seite braucht 1-2 Sekunden.
Der Fehler ist nun dass in den gescrapedten Daten Alle Zahlen unter 1000 das Komma gelöscht wird und sie dadurch viel zu groß werden in Notepad++ sieht das dann so aus:
wobei der richtige Kurs am 4.1.1988 natürlich "943,88" sein muss und nicht 94K.15.01.1988,,95815.0,,,
14.01.1988,,96564.0,,,
13.01.1988,,96461.0,,,
12.01.1988,,98949.0,,,
11.01.1988,,98957.0,,,
08.01.1988,,1025.28,,,
07.01.1988,,1009.01,,,
06.01.1988,,1020.16,,,
05.01.1988,,1004.34,,,
04.01.1988,,94388.0,,,
01.01.1988,,1000.0,,,
Mit viel Testen konnte der Fehler auf die fett markierte Zeile eingegrenzt werden also Pandas read_html Methode.
Code:
html = browser.page_source
tables = pd.read_html(StringIO(html))
lässt man sich mit enumerate den Inhalt und Typ von tables anzeigen:
erhält man:if tables:
print(f'--- Seite {page} ---')
print(tables[0].head()) # Zeigt die ersten Zeilen der Tabelle
if 'Schluss' in tables[0].columns:
for idx, val in enumerate(tables[0]['Schluss']):
print(f'Zeile {idx}: Wert = {repr(val)}, Typ = {type(val)}')
Wobei Zeile 25 der 4.1. also "943,88" sein müsste. und nicht 94 tausend...Zeile 25: Wert = '94388', Typ = <class 'str'>
Zeile 26: Wert = '1.000,00', Typ = <class 'str'>
Die Werte sind zwar als string eingelesen aber die Zahlen kleiner tausend haben von Pandas fälschlicherweise das Komma gelöscht bekommen.
Weiß dazu jemand mehr warum Pandas bei europäischem Zahlenformat diesen Fehler hat und wie könnte man den umgehen?
Woher wissen wir denn das Selenium-Response-Objekt "html" nicht schon falsch ist?
Der ganze Code ist etwas zu ausführlich zum hier Posten.
Ich habe aber das gescrapde Responseobjekt, bytegenau auf die Platte geschrieben und Euch angehängt. Anstatt die ganzen Einstellungen die notwendig sind bis das Webscraping läuft könnt ihr Euch einfach das Endprodukt der ganzen Mühen anschauen/einlesen. Ich konnte nur keine ".html" Dateien hier im Forum posten ihr müsst die Endung in "html" ändern.
Wenn ihr Euch da die Zahlen raussuchen wollt
Die "1000,00" vom 1.1.1988 hat als "Copy Element":
<td _ngcontent-boerse-frankfurt-c352035757="" class="widget-table-cell text-end"> 1.000,00</td>
Die 943,88:
<td _ngcontent-boerse-frankfurt-c352035757="" class="widget-table-cell text-end"> 943,88</td>
Ich habe die Zahlen auch mittels:
https://www.babelstone.co.uk/Unicode/whatisit.html
verglichen aber sie sehen identisch codiert aus. Sieht also nach einem harten Fehler in Pandas read_html aus.