JSON {{Objekt}}

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
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

Hallo wieder mal!

zur Zeit versuche ich mich in die Wikipedia API einzuarbeiten.
Bei einer Query bekomme ich ein JSON-Objekt, das u.a einen String enthält, in dem die Überschriften mit geschweiften Klammern kodiert sind:

Code: Alles auswählen

{{Überschrift}}
Absatz
Gibt es in Python schon einen fertigen Parser, der mir die Überschriften und die Absätze zurückliefert, oder muss ich mir selber was basteln?
Falls ich selber ran muss wäre ich wohl im "re" Modul gut aufgehoben?

Viele Grüße,
Werner
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wenn ich mich recht entsinne ist das Creole:

http://pypi.python.org/pypi?%3Aaction=s ... mit=search
the more they change the more they stay the same
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

Vielen Dank!
Auf "Creole" war ich noch gar nicht gestoßen!
Dann werd ich mich da auch noch einlesen :D
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zwei geschweifte Klammern sind im Creole-Syntax ein Bild... Egal. ;-)

Es gib einen fertigen Creole-Parser http://code.google.com/p/python-creole/ von Jens, der hier im Forum Mod ist. Zeitnahe Hilfe bei Fragen sollte also gewährleistet sein... ;-)

Gruß, noisefloor
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

jup, danke noisefloor, interessanterweise ist das Ergebnis von diesem Request: http://de.wiktionary.org/w/api.php?acti ... es=abandon ein JSON, indem die {{Überschriften}} in doppelten geschweiften Klammern stehen, da muss ich mich wohl noch tiefer durch die API wühlen... Oder weiss von euch jemand mehr darüber?

Vielleicht kurz zu der Idee dahinter: Ich lerne Vokabeln gerne mit Lernkarten http://de.wikipedia.org/wiki/Lernkartei, warum also nicht die Rückseite vom Wiktionary holen, anstatt sie selber einzugeben (wäre aber auch als einfacher Translator zu gebrauchen...) falls ich langfristig am Ball bleibe möchte ich daraus einen Web-Service machen, aber als Einstieg versuche ich mich gerade hier dran: http://developer.ubuntu.com/showdown/

Gruß, Werner
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdwerner hat geschrieben:jup, danke noisefloor, interessanterweise ist das Ergebnis von diesem Request: http://de.wiktionary.org/w/api.php?acti ... es=abandon ein JSON, indem die {{Überschriften}} in doppelten geschweiften Klammern stehen, da muss ich mich wohl noch tiefer durch die API wühlen...
Naja, das sieht mir stark nach Creole aus - innerhalb eines JSON-Strings kann man ja quasi alles serialisieren, also auch das Markup, auf welchem das Wiki aufbaut.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Hyperison: Meinst du, dass {{foo}} ein JSON-Objekt ist, welche "nur" das Element {foo} beinhaltet? Kann sein, wäre aber sehr verwirrend ;-)

Gruß, noisefloor
BlackJack

@noisefloor: Das wäre kein gültiges JSON. Das ganze Problem hat überhaupt nichts mit JSON zu tun. Ich denke das wollte Hyperion zumindest indirekt damit sagen: Dass man in JSON halt alles mögliche in die Zeichenketten tun kann.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@noisefloor: Nein, BlackJack hat das ja schon klar gestellt. Ich dachte es wäre mittlerweile offensichtlich, dass der eigentliche Inhalt nichts mit JSON zu tun hat, sondern in Richtung Creole-Markup geht.

Ich habe das ganze mal in einer Shell mittels `json`-Modul geladen und dann durch Jens Creole-Parser `python-creole` gejagt: Hier das Ergebnis. So wirklich toll ist die Ausgabe nicht; k.A. ob es sich nun wirklich um Creole handelt, oder ggf. Jens Parser zu strikt ist o.ä. (Ach so, hier die Originalseite)

Immerhin erkennt man nun im formatierten Dump schön, dass das JSON wirklich das "kleinste" Problem ist und ja lediglich als Container für den wahren Inhalt dient.

@mcdwerner: Wenn Du nur an die Bedeutung kommen willst, kannst Du ja mal gucken, ob man da nicht mittels RegExp dran kommt? Einen Creole-Parser mit AST gibt es ja nicht wirklich - @Jens: Oder bietet Deiner so etwas?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@Hyperion: mit Regex und String-Methoden Funktioniert es schon ganz gut.

Dass es sicher nicht an JSON liegt sieht man auch an der Abfrage als XML: http://de.wiktionary.org/w/api.php?acti ... es=abandon
Hier ist genau der selbe String enthalten...

Vermutlich haben die hier was eigenes, "Creole-artiges" gestrickt...

Ich werd am Ball bleiben...

Viele Grüße, Werner

Edit hat sich verschrieben
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, MediaWiki unterstützt soweit ich weiß kein Creole und Creole wurde an die MediaWiki-Syntax angelehnt, von daher nicht so verwunderlich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die Dinger in {{ }} sind Vorlagen, aka Makros, keine Überschriften. Überschriften werden bei Mediawiki mit führenden Gleichheitszeichen markiert.

Wenn man http://de.wiktionary.org/w/index.php?ti ... ction=edit aufruft, sieht man nicht nur den Quelltext, der auch über das API abgerufen werden kann, sondern auch eine lange Liste der Vorlagen, die in diesem Text benutzt werden. Nun kann man sich den Quelltext von z.B. "Siehe auch" anschauen: http://de.wiktionary.org/w/index.php?ti ... ction=edit . Ich rate mal, dass man daran auch über das API kommt.

Ich bin mir sicher, dass man irgendwo in der Wikipedia auch eine Beschreibung der Syntax findet. Wenn ich raten sollte, würde ich sagen, dass bei einer Vorlage nach dem {{ zunächst der Name kommt und dann hinter einem | ein oder mehrere Argumente bis zum }}. Innerhalb der Vorlage kann man dann mit {{{1}}} (also dreifachen geschweiften Klammern und einer Zahl) auf die Argumente zugreifen. Offenbar gibt es - zumindest in Vorlagen - auch noch bedingte Anweisungen wie "#if:" wo offenbar dann zwei || die Bedingung von dem Rumpf trennen. Das ist alles andere als trivial.

Zudem kann man nicht einfach nur mit regulären Ausdrücken und Suchen und Ersetzen arbeiten, weil Argumente von Vorlagen wieder Vorlagen referenzieren dürfen, also z.B. {{Siehe auch|{{Spache|Englisch}}}}.

Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sma hat geschrieben: Zudem kann man nicht einfach nur mit regulären Ausdrücken und Suchen und Ersetzen arbeiten, weil Argumente von Vorlagen wieder Vorlagen referenzieren dürfen, also z.B. {{Siehe auch|{{Spache|Englisch}}}}.
Aber Du weißt ja nicht, was der OP eigentlich will! Evtl. reicht ihm da ja schon eine gut "abgreifbare" Stelle der Seite(n)?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten