RSS-Parser

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
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Montag 23. Februar 2009, 13:28

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
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Montag 23. Februar 2009, 13:56

https://www.xing.com/go/invite/18513630.6a91d4
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Montag 23. Februar 2009, 18:50

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 :|
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 23. Februar 2009, 19:08

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.
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Montag 23. Februar 2009, 19:21

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?
DasIch
User
Beiträge: 2462
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 23. Februar 2009, 19:43

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 23. Februar 2009, 19:43

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 23. Februar 2009, 19:52

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 23. Februar 2009, 20:12

cofi hat geschrieben:Die Übersicht gibt es. Doku nennt sich das ;) http://docs.python.org/lib/lib.html
Update your bookmarks :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 23. Februar 2009, 20:21

Hmm Tatsache. Das hatte sogar noch eine Schlange ;)
BlackJack

Dienstag 24. Februar 2009, 08:06

@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. :-)
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Dienstag 24. Februar 2009, 11:31

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"]
https://www.xing.com/go/invite/18513630.6a91d4
Antworten