Dollarkurs

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Hey, ich habe ein ganz simples Programm geschrieben, das im 2-Minuten-Takt den Dollarkurs überprüft (Dollarkurs) und wenn er sich vom vorherigen, von vor 2 Minuten, differenziert, gibt er den neuen Dollarkurs aus. :mrgreen:

Code: Alles auswählen

import urllib, time

xf1='<div class="content"><table><tr><th>'
xf2=' <span>USD</span></th><th class="colorRed">'
url= r"http://www.finanzen.net/devisen/dollarkurs"
usd, usdx=2, 2

while 1:
    opurl = urllib.urlopen(url)
    for line in opurl:
        if line.find(xf1)!=-1:
            t=line.find(xf1)
            t+=len(xf1)
            r=line.find(xf2)
            usd=line[t:r]
    if usd==usdx:
        pass
    else:
        print time.ctime(), "...........", usd, "USD = 1 Euro"
    usdx=usd
    time.sleep(120)
Python 2.7 und Spyder benutzt. :P

Bisher habe ich immer diese Methode benutzt, um bestimmte Sachen zu filtern (str.find()). Einmal habe ich auf split() benutzt, um eine Liste von Informationen zu filtern, aber ich fand diese Methoden bisher nicht so elegant. :roll: Würde mich über Verbesserungsvorschläge, Tipps, etc. sehr freuen. Bin noch nicht so erfahren mit Python :P

Stefan
Zuletzt geändert von Anonymous am Samstag 20. Oktober 2012, 06:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
BlackJack

@StefanLawl: Die Namen sind grösstenteils schlecht, da nichtssagend, gewählt.

Ein paar mehr Leerzeichen um Zuweisungen und Operatoren würden die lesbarkeit erhöhen.

Wenn in einem ``if``- oder ``else``-Zweig ausschliesslich ein ``pass`` steht, dann hat man einen überflüssigen Zweig in dem Konstrukt.

Um zu testen ob eine Zeichenkette in einer anderen enthalten ist, wäre der ``in``-Operator lesbarer, also ``if a in b:`` statt ``if b.find(a) != -1:``. Im konkreten Fall würde man das Ergebnis von dem `find()` aber vielleicht besser *vor* dem ``if`` an einen Namen binden, denn falls der Test erfolgreich ist, braucht man das Ergebnis und muss es dann nicht durch erneutes suchen wieder berechnen.

Python hat einen eigenen Typ für Wahrheitswerte. Dessen Literale sollte man auch verwenden, statt 0 oder 1 dafür zu missbrauchen.

HTML würde ich mit einer entsprechenden Bibliothek verarbeiten, das ist in der Regel robuster. `lxml.html` oder `BeautifulSoup` bieten sich da an.

Edit:

Code: Alles auswählen

#!/usr/bin/env python
from time import ctime, sleep
from lxml import html

QUOTE_URL = 'http://www.finanzen.net/devisen/dollarkurs'
SYMBOL = 'USD'
DELAY = 120  # Delay between checks in seconds.


def main():
    old_value = None
    while True:
        document = html.parse(QUOTE_URL)
        value = document.xpath(
            '//div[@class="content_box pricebox"]//th[1]/text()'
        )[0].strip()
        if value != old_value:
            print '%s .......... %s %s = 1 EUR' % (ctime(), SYMBOL, value)
            old_value = value
        sleep(DELAY)


if __name__ == '__main__':
    main()
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Viele Dank für die Antwort :) Werde ich alles direkt mal ausbessern :)
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Antworten