Python Werte aus Tabelle (html) in Datei speichern

maddingamer

Cadet 3rd Year
Registriert
Mai 2014
Beiträge
49
Moin Moin Zusammen,

(Kurz vorweg, ich habe was Python und generell Programmieren angeht nicht wirklich Erfahrung)

Ich möchte aus einer Tabelle einer Website (2 Spalten, 50 Zeilen) automatisch die erste Zeile auslesen und diese in eine fortlaufende eigene Tabelle speichern. Etwa alle 7 Minuten kommt in der 1. Zeile ein neuer Wert dazu und die Tabelle "rutscht" eine Zeile runter.

Das Auslesen der Tabelle habe ich hinbekommen, nur habe ich noch den HTML-Code der im Output stört, und ich weiß noch nicht wie ich das ganze zu einer fortlaufenden Datei/Datenbank o.Ä. speichern kann.

Hier der Code:

Python:
from BeautifulSoup import BeautifulSoup
import urllib2

response = urllib2.urlopen( "https://measurements.mobile-alerts.eu/Home/MeasurementDetails?deviceid=024241E85F13&vendorid=3ba9bbb5-aa69-49a0-9ece-36419a9230d9&appbundle=eu.mobile_alerts.mobilealerts")
html = response.read()

parsed_html = BeautifulSoup(html)

zeit = parsed_html.body.find("td", attrs={"class":"timestamp"})
wert = parsed_html.body.find("td", attrs={"class":"measurement"})

print("Messzeitpunkt:%s | Temperatur:%s" % (zeit, wert))

Als Output erhalte ich:
Code:
Messzeitpunkt:<td class="timestamp">05.08.2018 14:53:24</td> | Temperatur:<td class="measurement">8,3 C</td>)

Da sollen natürlich eigentlich nur die Werte stehen..

Habe es schon mit
Code:
import re
print (re.sub("<", " ", "zeit"))
versucht, allerdings kommt dann als Output nur "Zeit"und kein Wert..

Vielleicht hat der ein oder andere ja eine Idee :))

Vielen Dank schonmal!
 
Das zeit ist ja eine Variable, in "" übergibts du ja einen string "zeit" ...
 
Ein Blick in das BeautifulSoup Handbuch im Abschnitt Quick Start genügt:

Code:
from BeautifulSoup import BeautifulSoup
import urllib2

response = urllib2.urlopen(
"https://measurements.mobile-alerts.eu/Home/MeasurementDetails?deviceid=024241E85F13&vendorid=3ba9bbb5-aa69-49a0-9ece-36419a9230d9&appbundle=eu.mobile_alerts.mobilealerts")
html = response.read()

parsed_html = BeautifulSoup(html)

zeit = parsed_html.body.find("td", attrs={"class":"timestamp"}).string
wert = parsed_html.body.find("td", attrs={"class":"measurement"}).string

print("Messzeitpunkt:%s | Temperatur:%s" % (zeit, wert))

Wegschreiben kannst du das ganze dann mit
Code:
with open('output.txt', 'a') as f:
    f.write("Messzeitpunkt:%s | Temperatur:%s\n" % (zeit, wert))
 
Vielen Dank! Klappt perfekt :)
Wie schaffe ich es denn nun doppelte Werte zu vermeiden? Also mein Plan ist das ganze Script im Loop laufen zu lassen und da soll natürlich nicht mehrfach der gleiche Wert in der Datei stehen.. Hast du da eine genau so gute Idee? :))
 
Wäre klasse wenn mir jemand helfen könnte: Mir fehlt nun noch ein Loop und eine Art der Vermeidung von doppelten Werten. Also so dass wirklich nur neue Werte in die Datei geschrieben werden.. Jemand eine Idee?


LG
 
Du merkst dir in einer weiteren Variable den Wert der zuletzt weggeschriebenen timestamp und vergleichst ihn vor dem Schreiben der neuen Zeile mit dem neu abgefragten Wert. Ist es immer noch der gleiche Wert, schreibst du einfach nicht, sondern wartest eine Weile, bevor du wieder anfragst.
 
Tumbleweed schrieb:
Du merkst dir in einer weiteren Variable den Wert der zuletzt weggeschriebenen timestamp und vergleichst ihn vor dem Schreiben der neuen Zeile mit dem neu abgefragten Wert. Ist es immer noch der gleiche Wert, schreibst du einfach nicht, sondern wartest eine Weile, bevor du wieder anfragst.

Genau das ist der Plan. Aber wie setzte ich das um?
 
Python:
import time
import urllib2

from BeautifulSoup import BeautifulSoup

OUTPUT_FILENAME = "data-%s.txt" % time.strftime("%d_%m_%Y_%H_%M_%S")

OUTPUT_TEMPLATE = "Messzeitpunkt:%s | Temperatur:%s\n"

DATA_URL = ("https://measurements.mobile-alerts.eu/Home/MeasurementDetails"
            "?deviceid=024241E85F13&vendorid=3ba9bbb5-aa69-49a0-9ece-36419a9230d9"
            "&appbundle=eu.mobile_alerts.mobilealerts")

POLL_INTERVAL_IN_S = 60

def fetch_data():
    try:
        response = urllib2.urlopen(DATA_URL)
    except urllib2.HTTPError, ex:
        print  "HTTPError = %s" % ex.code
    except urllib2.URLError, ex:
        print "URLError = %s"  % ex.reason
    except Exception, ex:
        import traceback
        print traceback.format_exc()

    parsed_html = BeautifulSoup(response.read())
    timestamp = parsed_html.body.find("td", attrs={"class":"timestamp"}).string
    value = parsed_html.body.find("td", attrs={"class":"measurement"}).string
    #print OUTPUT_TEMPLATE % (timestamp, value)
    return timestamp, value

def write_data(timestamp, value):
    with open(OUTPUT_FILENAME, "a") as output_file:
        output_file.write(OUTPUT_TEMPLATE % (timestamp, value))

def main():
    last = ""
    while True:
        timestamp, value = fetch_data()

        if timestamp != last:
            write_data(timestamp, value)
            last = timestamp

        time.sleep(POLL_INTERVAL_IN_S)

if __name__ == "__main__":
    main()
 
hi Trublegum, Maddinggamer und Tumbleweed.

vielen Dank für das tolle Beispiel - für die Hinweise auf die Doku zu Beautifulsoup und die Umsetzung. Das läuft mit Python2 - nicht wahr. Heute würde man (was urllib2 anbelangt) dann mit Requests umsetzen, oder?!

Code:
from BeautifulSoup import BeautifulSoup
import urllib2

response = urllib2.urlopen(
"https://measurements.mobile-alerts.eu/Home/MeasurementDetails?deviceid=024241E85F13&vendorid=3ba9bbb5-aa69-49a0-9ece-36419a9230d9&appbundle=eu.mobile_alerts.mobilealerts")
html = response.read()

parsed_html = BeautifulSoup(html)

Arbeite mich gerade in BS4 ein - Danke nochmals für dieses schöne Beispiel.

VG Tarifa,
 
Zurück
Oben