Python HTML

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Python1961
User
Beiträge: 2
Registriert: Freitag 19. Juni 2020, 21:22

Hallo alle zusammen.
ich habe versucht einen einfachen Währungsrechner zu programmieren komme aber gerade nicht weiter ich hoffe jemand von euch kann mir weiterhelfen.

Wenn ich es versuche auf irgendeine art und weise zu printen, wird mir der Fehler angezeigt das man ein Int und ein Tag nicht multiplizieren kann. Ich hab auch schon nachgeguckt ob man den Tag casten kann aber nichts nützliches gefunden. Desweiteren gibt mir mein Programm schon den aktuellen Währungskurs aus den er aus dem HTML Code entnimmt aber kann es leider nicht weiter verwenden.
--> Eingetippte Geldmenge * aktueller Wechselkurs (Für mehrere Wechselkurse gleichzeitig)

Code:

import urllib.request
import requests
from bs4 import BeautifulSoup

url = "https://www.onvista.de/devisen/"

r = requests.get(url)

html_content = r.text
soup = BeautifulSoup(html_content, "html.parser")


for tr in soup.find_all('tr'):
tds = soup.find_all('td')

currency = []

print("Euro/USD: %s \nEuro/Schweitzer Franken: %s\nEuro/Türkische Lira: %s\n" %\
(tds[3].text, tds[24].text, tds[116].text))

money = int(input("Geben Sie Ihre Geldmenge in Euro ein: "))

print(money*(tds[116]))


kleine anmerkung:"Es hilft mir nicht nur zu sagen du musst es anders Parsen oder des gleichen".

Danke schonmal im vorraus.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Python1961: Whoa Du bist innerhalb dieses Tages um 6 Jahre gealtert? Als Du die Frage heute Mittag schon mal gestellt hast, warst Du noch Python1967: viewtopic.php?f=1&t=48965

Was genau hilft Dir an den Antworten dort nicht? Hast Du denn schon mal das Python-Tutorial in der Python-Dokumentation durchgearbeitet? Und damit wir das mal üben: Zeig doch bitte mal den konkreten Fehler den Du bekommst. Nicht irgendwie umschrieben, sondern 1:1 den Traceback in den Beitrag kopieren. Also das was Sirius3 in dem anderen (gleichen) Thema schon nachgefragt hatte.

Die Meldung sagt ja, das etwas nicht multipliziert werden kann. Was multiplizierst Du denn da? Schau Dir das doch mal an. Also lass Dir das mal Ausgeben. Also Zeichenkette, als `repr()`-Darstellung, und auch mal den mit `type()` ermittelten Typ der beiden Operanden.

Und auch wenn Du das aus irgendwelchen Gründen anscheinend nicht hören willst: Da einfach *alle* <td>-Elemente der *gesamten* Seite raus zu suchen und per magischen Indexwerten drei aus allen raus zu greifen und zu hoffen dass das die richtigen sind, wird nicht lange gut gehen. Das sollte Dir eigentlich klar sein wenn Du HTML verstehst und wie solche Seiten dynamisch erstellt werden. Sollte Dir das nicht klar sein, müsstest Du Dich dringend auch mit HTML auseinandersetzen und wie das vom Browser und von BeautifulSoup in einen Objektbaum umgewandelt wird und wie man auf dem sicher(er) Inhalte annavigieren kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Python1961
User
Beiträge: 2
Registriert: Freitag 19. Juni 2020, 21:22

Ich musste mir leider einen zweiten account erstellen weil ich in den ersten auf einmal nicht mehr reinkomme obwohl Passwort und Benutzername stimmt.

Der Fehler der mir angezeigt wird lautet:

TypeError: unsupported operand type(s) for *: 'Tag' and 'int'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die Fehlermeldungen in gaenze und in Code-Tags praesentieren.

Und es wurde schon erwaehnt, was da in die Hose geht: du musst den Text aus dem Tag-Objekt holen, und in eine Ganzzahl wandeln.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Gar nicht so einfach, diese Seite ohne sinnvolle Annotation zu parsen:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

URL = "https://www.onvista.de/devisen/"

def read_table(url):
    response = requests.get(url)
    document = BeautifulSoup(response.text, "html.parser")
    table = document.select_one('div.EUR.CONTENT_NAVI_INHALT table')
    header = list(cell.text for cell in table.select("thead tr th"))
    return [
        dict(zip(header, row.stripped_strings))
        for row in table.select("tbody tr")
    ]

def main():
    table = read_table(URL)
    currencies = {
        row["Wert"]: row["akt. Kurs"]
        for row in table
    }
    print("Euro/USD: %s \nEuro/Schweitzer Franken: %s\nEuro/Türkische Lira: %s" %
        (currencies["Eurokurs (Euro / Dollar)"], currencies["Euro - Schweizer Franken"], currencies["Euro - Türkische Lira"]))

if __name__ == '__main__':
    main()
Antworten