Seite 1 von 1

RSS-Parser

Verfasst: Montag 23. Februar 2009, 13:28
von vogti
Hallo ihr Schlangenbeschwörer ;)
ich habe hier ein RSS-Dokument. Mein Ziel ist es, den Inhalt von Tags wie Description, title und link herauszuschneiden und abzuspeichern.
Jetzt die Frage: gibt es eine Funktion, mit der ich z.B. bis zum String '<title>' gehen kann, und ab dem bis zum String '</title>' alles in eine Variable (liste?) packe?
Was gibt es noch für Möglichkeiten an dieses Problem heranzugehen?

lg,
vogti

Verfasst: Montag 23. Februar 2009, 13:56
von lutz.horn

Verfasst: Montag 23. Februar 2009, 18:50
von vogti
lutz.horn hat geschrieben:Verwende http://feedparser.org/.
Naja, hatte eigentlich gehofft, dass man da keine extra Bibliothek benötigt. Gibt es vielleicht irgendwo eine Übersicht, wo Operationen für/mit Strings aufgelistet sind? Mein Problem ist eigentlich, dass ich nicht genau weiß, wonach ich suchen soll :|

Verfasst: Montag 23. Februar 2009, 19:08
von cofi
Die Übersicht gibt es. Doku nennt sich das ;) http://docs.python.org/lib/lib.html

Die Sache ist aber, dass du nicht mit Strings spielen willst, sondern mit XML Dateien. Du solltest dir mal ElementTree anschauen.

Verfasst: Montag 23. Februar 2009, 19:21
von vogti
Na aber laut Wikipedia sind xml-Dokumente mit RSS-Standart alle nach dem gleichen Muster aufgebaut. Darum dachte ich, dass ichs mir einfahc machen könnte und quasi immer nur nach den Tags wie <title>, <description ... etc. suchen kann. Warum muss ich da großartig mit XML-Bäumen rumhandtieren? Solange ich wirklich nur RSS-XML parse sollte das doch glatt laufen?

In der aktuellen CT (05/09) gibt es folgenden PHP-Schnipsel für ein ähnliches Problem:

Code: Alles auswählen

$titel = preg_match&#40;'#<title>&#40;.+?&#41;</title>#'&#41;, $inhalt, $treffer&#41;? $treffer[1] : $pfad; 
In diesem Abschnitt gehts darum den Titel eines HTML-Dokuments auszulesen. Kann man soetwas nicht auch in Python übersetzen?

Oder noch einfacher: Kann ich nicht wenigstens nach dem nächsten "<title>" bzw. "</title>" suchen? Den rest kann man sich ja selbst zusammen basteln... Gibt es da eine Funktion für?

Verfasst: Montag 23. Februar 2009, 19:43
von DasIch
vogti hat geschrieben:Na aber laut Wikipedia sind xml-Dokumente mit RSS-Standart alle nach dem gleichen Muster aufgebaut.
In der Theorie stimmt dass auch. In der Praxis gibt es im Web alles aber keine Standards. Nimm lieber einen fehlertoleranten XML Parser, der versagt nicht so schnell wie irgendwelche Regular Expressions.

Verfasst: Montag 23. Februar 2009, 19:43
von cofi
Du wirst keinen Spass haben, wenn du RSS mit RegExp "parsen" willst. Das Problem dabei ist einfach, dass die zwar alle dem Standard folgen, aber machst du es mit RegExp, dann stüzt dein Kartenhaus schnell zusammen, wenn etwas nicht passt - beim Debuggen schon mal viel Spass ;)
Schau dir die ElementTree Dokumentatiin an, dann wirst du sehen, dass es damit einfacher ist als mit kryptischen RegExp - wir sind hier ja nicht bei Perl.

Solltest du es doch damit machen wollen, dann schau dir die re-Dokumentation und vielleicht auch das RegExp Howto an.

Verfasst: Montag 23. Februar 2009, 19:52
von Leonidas
Der Nachteil bei regulären Ausdrücken ist, dass man damit nicht wirklich parsen kann, da bei verschachtelten Strukturen wie sie gerade bei Markup-Formaten wie SGML oder XML oft vorkommen nicht richtig matchen können. Da müsste man noch etwas Supportcode der in verschiedene Zustände wechselt haben (siehe Pygments) und dann ist man nach einigen Stunden debuggen grob da wo man mit dem Feedparser sofort ist.

Weiterer Vorteil: ein XML-Parser ist wesentlich schneller als reguläre Ausdrücke.

Aber gerade auch wenn man mit RSS 0.9, 1.0, 2.0 und Atom konfrontiert ist (die alle miteinander inkompatibel sind), mag man dann nicht für jedes Format einen eigenen Parser schreiben.

Verfasst: Montag 23. Februar 2009, 20:12
von birkenfeld
cofi hat geschrieben:Die Übersicht gibt es. Doku nennt sich das ;) http://docs.python.org/lib/lib.html
Update your bookmarks :)

Verfasst: Montag 23. Februar 2009, 20:21
von cofi
Hmm Tatsache. Das hatte sogar noch eine Schlange ;)

Verfasst: Dienstag 24. Februar 2009, 08:06
von BlackJack
@vogti: Zum Thema XML seien "einfache" Zeichenketten:

Code: Alles auswählen

<title>One way to embed <![CDATA[</title>]]> in a title</title>
Viel Spass beim "parsen" mit regulären Ausdrücken. :-)

Verfasst: Dienstag 24. Februar 2009, 11:31
von lutz.horn
vogti hat geschrieben:
lutz.horn hat geschrieben:Verwende http://feedparser.org/.
Naja, hatte eigentlich gehofft, dass man da keine extra Bibliothek benötigt.
Warum denn so kompliziert? Der Sinn von Bibliotheken ist es, dass wiederkehrende Probleme nur einmal gelöst werden müssen. Feedparser ist eine sehr stabile Bibliothek, die ein für alle Mal das Problem "wie parse ich stabil einen Feed?" gelöst hat.

Code: Alles auswählen

#!/usr/bin/env python

import feedparser

feed = feedparser.parse("http://blog.fefe.de/rss.xml?html")
print feed["feed"]["title"]