Hallo zusammen,
ich bin gerade dabei einen Feed-Parser zu programmieren.
Das Programm programmiere ich meistens auf meinem Windows Rechner und schiebe es, wenn es funktioniert, auf meinen Raspberry. Hierbei bin ich auf das Problem gestoßen, dass unter Windows mein Programm fehlerfrei ausgeführt wird, auf dem Rpi jedoch nicht.
Es geht um folgende Funktion (ist Teil einer Klasse, da ich mehrere Feeds vom gleichen Anbieter laden möchte):
def feed_laden(self):
# RSS-Feed herunterladen
d = feedparser.parse(self.feedUrl)
# Anzahl der Feeds herausfinden
anzahl = len(d["entries"])
# Vergleich ob der Feed neu ist
datumfeed = time.strftime('%Y-%m-%d', d['feed']['updated_parsed'])
if self.csvLetzterEintrag() != datumfeed:
# Eintrag ungleich, Feed komplett laden und speichern
print("* " + self.feedName + ": Veränderung gefunden, Feed wird gespeichert.")
# Bot-Nachricht vorbereiten
botmsg = self.feedName + ":%0A"
# Feeds einzeln laden und in einer Zeile für die csv-Datei speichern
for i in range(0, anzahl):
a = '"'
b = time.strftime('%Y-%m-%d', d['feed']['updated_parsed'])
a = a + b + '";'
a = a + '"' + time.strftime('%H:%M', d['feed']['updated_parsed']) + '";'
a = a + '"' + time.strftime('%Y-%m-%d', d.entries[i].published_parsed) + '";'
a = a + '"' + time.strftime('%H:%M', d.entries[i].published_parsed) + '";'
a = a + '"' + time.strftime('%Y-%m-%d', d.entries[i].updated_parsed) + '";'
a = a + '"' + time.strftime('%H:%M', d.entries[i].updated_parsed) + '";'
a = a + '"' + d.entries[i].title + '";'
a = a + '"' + d.entries[i].link + '";'
a = a + '"' + d.entries[i].author + '";'
a = a + '"' + self.TextLaden(d.entries[i].link) + '"\n'
self.zeile.append(a)
# Bot-Nachricht als lokale Variable vorbereiten
botmsg = botmsg + d.entries[i].title + "%0A"
# Titel in der Konsole ausgeben
if self.Konsole == True:
print(d.entries[i].title)
# Ggf. Bot-Nachricht verschicken
if self.BotUpdate == True:
self.BotNachricht(str(botmsg))
# Feed-Inhalt in einer CSV-Datei speichern
#self.csvSpeichern()
print("* " + self.feedName + ": Veränderung gefunden, Feed gespeichert.")
else:
print("* " + self.feedName + ": Keine Veränderung gefunden, lokale Speicherung aktuell.")
Display More
Am Anfang vergleicht er, ob der aktuelle Feed bereits in einer csv-Datei gespeichert ist. Die Funktion TextLaden() öffnet mir den im Feed hinterlegten Link und speichert mit den gesamten Textblock (nicht nur die Zusammenfassung aus dem Feed). Die Funktion csvLetzterEintrag() gibt das zuletzt gespeicherte Feed-Update-Datum zurück. Damit es vollständig ist, hier die Funktion:
def csvLetzterEintrag(self):
# Letztes Update-Datum aus der CSV-Datei herausfinden
df = pd.read_csv(self.csvDatei,
sep=";",
quotechar='"',
engine="python",
header=1,
names=["feed_update_datum","feed_update_zeit","pub_datum",
"pub_zeit","update_datum","update_zeit", "titel",
"link","author","text"])
# Rückgabewert, das Update-Datum des letzten Eintrages
return(df["feed_update_datum"][-1:].all())
Display More
Unter Windows wird das Programm fehlerfrei ausgeführt, unter Unix auf dem Rpi erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "portal.py", line 164, in <module>
a.feed_laden()
File "portal.py", line 64, in feed_laden
datumfeed = time.strftime('%Y-%m-%d', d['feed']['updated_parsed'])
File "/usr/local/lib/python3.7/dist-packages/feedparser.py", line 348, in __getitem__
return dict.__getitem__(self, 'updated_parsed')
KeyError: 'updated_parsed'
Ich hatte aber auch generell viele Probleme mit der Handhabung der Datums-Angaben. Sieht man vermutlich auch
Es gibt wahrscheinlich eine deutlich elegantere Version 
Über jede Anregung bin ich dankbar. Vermutlich sieht man daran, das ich noch am Anfang meiner Programmierer-Karriere stehe 
Beste Grüße
Mr_C