TypeError: decoding str is not supported

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
starki
User
Beiträge: 8
Registriert: Freitag 17. August 2012, 19:59

Hallo Leute,

ich bekomme folgende Fehlermeldung:
Traceback (most recent call last):
File "parse2.py", line 108, in <module>
feed = feedparser.parse(feedlist)
File "/usr/local/lib/python3.4/dist-packages/feedparser-5.1.3-py3.4.egg/feedparser.py", line 3966, in parse
File "/usr/local/lib/python3.4/dist-packages/feedparser-5.1.3-py3.4.egg/feedparser.py", line 3768, in convert_to_utf8
TypeError: decoding str is not supported


Mein Programm tut folgendes: Ich habe eine Liste an Feeds, die dich durchgehe und wenn es etwas neues gibt, dann werde ich darüber benachrichtigt. Unter Windows 7 funktioniert mein Code ohne die obige Fehlermeldung. Unter Linux (Kubuntu) bekomme ich jedoch obige Fehlermeldung bei folgendem Code (letzte Zeile):

Code: Alles auswählen

for i in range(len(feedlist)):
   print("[*] *********************************")
   print("[*] Feedliste Nr. " + str(i + 1) + ": " + feedlist[i])
   print(type(feedlist[i]))
   # Lade Feeds
   feed = feedparser.parse(feedlist[i])
Jedoch weiß ich leider nicht, was ich da tun kann. Hat einer einen Rat für mich?
BlackJack

@starki: Das sieht nach einem Fehler in `feedparser` aus, das versucht einen Unicode-String zu dekodieren, was schlicht nicht geht.

Deine Schleife sieht übrigens ziemlich „unpythonisch” aus mit diesem Umweg über eine Indexvariable. Man kann in Python *direkt* über die Elemente einer Liste iterieren. Wenn man *zusätzlich* eine laufende Zahl benötigt, verwendet man die `enumerate()`-Funktion. Der kann man auch einen Startwert übergeben und sich damit das ``+ 1`` ersparen.

Um Werte in Zeichenketten zu formatieren gibt es in Python die `format()`-Methode auf Zeichenketten. ``str()`` und ``+`` ist eher BASIC als Python.

Konkrete Typen gehören eigentlich nicht in Namen. Die Typen können sich im Laufe der Programmentwicklung ändern, und dann muss man entweder überall die Namen anpassen, oder man hat falsche, irreführende Namen im Code stehen. Statt `feedlist` würde man einfach `feeds` schreiben.

Edit: Die Schleife in „pythonisch”:

Code: Alles auswählen

for i, feed_url in enumerate(feed_urls, 1):
    print('[*] *********************************')
    print('[*] Feedliste Nr. {0}: {1}'.format(i, feed_url))
    print(type(feed_url))
    feed = feedparser.parse(feed_url)
Einrücktiefe ist vier Leerzeichen pro Ebene und nicht drei.
Antworten