Problem bei 'pd.read_html'

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst halt rausfinden, was da dann fuer tatsaechlicher Netzwerkverkehr stattfindet. Oder die Seite mit Selenium fernsteuern.
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

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 :evil: 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
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

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:

Code: Alles auswählen

df.to_csv('Test.csv', sep=';')

gibt:

Code: Alles auswählen

AttributeError: 'list' object has no attribute 'to_csv'
Ich dachte, dass

Code: Alles auswählen

df  = pd.read_html(tbl)
einen DataFrame erzeugt, welchen man dann einfach in die .csv schreibt.....
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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 :shock:
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

Danke - das nennt man Brett vorm Kopf....
SautaRoc
User
Beiträge: 48
Registriert: Donnerstag 20. September 2018, 13:18

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. 8)
Antworten