Seite 1 von 1
Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 15:22
von SautaRoc
Hallo,
ich lade mir aus dem Netz mit pd.read_html eine Tabelle in ein Dataframe.
Das geht ohne Probleme. Schwierigkeiten habe ich, weil auf der Seite eine andere Version der Tabelle angeboten wird, zum umschalten jedoch ein button gedrückt werden muss, welcher dann die Seite mit der gleichen URL jedoch in einer anderen Version anzeigt.
Meine Frage wäre nun wie ich das umschalten per skript gestalten könnte.
Der HTML Code an der Stelle schaut so aus:
Code: Alles auswählen
<label class="btn btn-primary active">
<input name="type" onchange="reloadEurexContent('DE0008469008')" type="radio" value="call" autocomplete="off">
Vielen Dank für Tipps wie man so ein Problem angehen kann.
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 15:48
von __deets__
Du musst halt rausfinden, was da dann fuer tatsaechlicher Netzwerkverkehr stattfindet. Oder die Seite mit Selenium fernsteuern.
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 17:02
von SautaRoc
ich war mittlerweile auch bei Selenium gelandet. Nachdem die ganzen Treiberprobleme gelöst waren und ich rausgefunden habe, dass Selenium eine Class mit Leerzeichen nicht erkennt

kommt ein neues Problem:
über Selenium wird jetzt zwar wie gewünscht der richtige Button geklickt und ich sehe in Chrome die korrekte Seite, nur hat das ja nun nichts mit meinem pd.read_html mehr zu tun.
ich dachte, ich wechsele mit Sellenium die Seite und wiederhole dann einfach das pd.read_html. Geht nicht - ich dachte ok, da muss eine Wartezeit rein, damit die Seite erstmal geladen wird und dann machst du pd.read_html.
Geht auch nicht. Also liegt das Problem vermutlich darin, dass ich ja gar nicht auf die neue Chromeseite zugreife sondern mit pd.read_html auf eine ganz andere Instanz.
Kann mir jemand sagen, wie ich den nun auf die in Chrome angezeigte Seite zugreifen kann?
Danke
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 17:09
von __blackjack__
@SautaRoc: Es gibt keine CSS-Klassen mit Leerzeichen. Wenn da Leerzeichen im Wert vom ``class``-Attribut sind, dann trennen die mehr als eine Klasse.
Du kannst/musst Dir von Selemnium den Quelltext der Webseite, oder zumindest den der Tabelle, geben lassen.
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 17:52
von SautaRoc
ich bin jetzt etwas weiter gekommen:
Code: Alles auswählen
# Click login
Put_button.click()
# Wait for 5 seconds
time.sleep(15)
tbl = driver.find_element_by_id("ein_name").get_attribute('outerHTML')
df = pd.read_html(tbl)
print(df)
Code: Alles auswählen
[ Monat Index Typ Letzter Kurs
0 2018/11 abc1 XXX 140
1 2018/11 abc2 XXX 020
2 2018/11 abc3 XXX -
]
das erzeugt zumindest schonmal eine Liste mit der gewünschten Tabelle.
das es anscheinend keine Lösung ohne ein neues Problem gibt: Wie bekommt man das jetzt in eine .csv? denn:
gibt:
Code: Alles auswählen
AttributeError: 'list' object has no attribute 'to_csv'
Ich dachte, dass
einen DataFrame erzeugt, welchen man dann einfach in die .csv schreibt.....
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 17:57
von __deets__
Da es das recht offensichtlich nicht tut, erzeug doch einen Dataframe aus einer Liste...?
Edit: Thomas hat das Problem gefunden. Macht ja auch sinn, da in einer HTML-Seite ja mehrere Tabellen sein koennen.
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 17:58
von ThomasL
schau mal hier:
http://pandas.pydata.org/pandas-docs/st ... _html.html
.read_html returns list of DataFrames
und eine Liste hat keine .to_csv() Methode

Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 18:17
von SautaRoc
Danke - das nennt man Brett vorm Kopf....
Re: Problem bei 'pd.read_html'
Verfasst: Mittwoch 14. November 2018, 21:12
von SautaRoc
Das war jetzt eine schwierige Geburt, aber am Ende hat es doch noch geklappt.
Code: Alles auswählen
tbl = driver.find_element_by_id("ein_name").get_attribute('outerHTML')
df = pd.read_html(tbl)
df1=df[0]
df1.to_csv('Test.csv', sep=';')
pd.read sammelt ja nur Tabellen ein - Ich habe nur nach einer bestimmten gesucht und daher müsste die den Index '0' haben.
