Seite 1 von 1

Python HTML

Verfasst: Freitag 19. Juni 2020, 21:36
von Python1961
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.

Re: Python HTML

Verfasst: Freitag 19. Juni 2020, 22:33
von __blackjack__
@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.

Re: Python HTML

Verfasst: Freitag 19. Juni 2020, 23:05
von Python1961
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'

Re: Python HTML

Verfasst: Samstag 20. Juni 2020, 09:29
von __deets__
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.

Re: Python HTML

Verfasst: Samstag 20. Juni 2020, 13:22
von Sirius3
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()