SGMLParser zum rausfischen von Tags...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 2. September 2005, 20:59

Ich möchte bei PyLucid das Rendern der Seite ändern...
Dazu soll eine HTML-Seite zum Browser geschickt werden, dabei alle PyLucid-Tags abgefangen und mit leben gefüllt werden...

Ich dachte daran einen SGMLParser so zu konfigurieren, das alle Daten, bis auf die speziellen Tags (z.B. <lucidTag:main_menu/> oder <lucidFunction:RSS>URL</lucidFunction>) unverändert durchgereicht werden...

Stößt der Parser auf die lucid-Tags werden aktionen ausgeführt um die Tags mit Inhalten zu ersetzten...

Aber wie mache ich das am besten??? Muß ich alle Methoden wie handle_starttag(), handle_data() usw. selber Programmieren?

Eine andere Lösung wäre sowas wie Zeilenweise verarbeiten und mit RE die Tags rausfischen... So ähnlich funktioniert es z.Z. (Ganz ähnlich wie blackbird's parser: http://www.python-forum.de/viewtopic.php?p=18944#18944 )

Ich möchte allerdings gern einen Datenstrom erzeugen, statt die Seite komplett im Speicher zusammen zu bauen und dann erst zum Browser zu schicken...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 2. September 2005, 21:28

Hm... Hab mir da gerade was mit re gebastelt:

Code: Alles auswählen

import sys, cgi, re

class parser:

    def feed( self, content ):
        for matchobj in re.finditer( "(.*?)(<.*?>)(.*?)(?us)", content ):
            sys.stdout.write( matchobj.group(1) )

            tag = matchobj.group(2)
            if tag.startswith( "<lucid" ):
                self.handle_tag( tag )
            else:
                sys.stdout.write( tag )

            sys.stdout.write( matchobj.group(3) )

    def handle_tag( self, tag ):
        # Hier wird was passieren... ;)
        sys.stdout.write( "*%s*" % tag )
Was haltet ihr davon???

EDIT: Ach mist, es klappt zwar ganz prima bei einfachen Tags wie <lucidTag:main_menu/> aber leider nicht direkt bei Tags mit Informationen, wie <lucidFunction:RSS>URL</lucidFunction>, denn die URL will ich ja haben...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Freitag 2. September 2005, 22:31

Hallo jens,
ich hatte vor einiger Zeit mal was ähnliches gebastelt (PHP).
Dabei hab ich einfach die die XML Namensräume ausgenutzt.
(<lucidFunction:RSS>URL</lucidFunction:RSS>) ich kenn mich nicht so aus mit XML und Python würde dir aber dazu raten mit SAX zu arbeiten.

Hab mich grad an was erinnert:
http://aspn.activestate.com/ASPN/Cookbo ... ipe/149284 :-)

Vieleicht ist das ein Ideenanstoß

MfG
Andreas
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 2. September 2005, 22:47

XT@ngel hat geschrieben:Dabei hab ich einfach die die XML Namensräume ausgenutzt. (<lucidFunction:RSS>URL</lucidFunction:RSS>) ich kenn mich nicht so aus mit XML und Python würde dir aber dazu raten mit SAX zu arbeiten.
Naja, die Tags jetzt noch ändern wollte ich eigentlich nicht, da es schon einige Seiten gibt in denen die geändert werden müßten ;) Nagut, könnte man mittels suchen-ersetzten auch automatisch erledigen lassen...


Mit ist aber eingefallen, das es garnicht wirklich möglich ist, alles in einem Stream zu erledigen...
Erstens hat man bei CGI eh nicht's davon, weil der Server anscheinend erst die Daten zum Browser schickt wenn alles erledigt ist :(
Zweitens hab ich z.B. den Tag <lucidTag:page_msg/> der wird von Nachrichten aus dem PyLucid-System ersetzt. Nur die Nachrichten können auch fast am Ende der Abarbeitung erst entstehen...

Weiß jemand wie es andere Systeme erledigen???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 2. September 2005, 23:04

OK, ich hab mir jetzt folgendes gebastelt:

Code: Alles auswählen

import sys, cgi, re

class parser:
    def feed( self, content ):
        content = re.sub( "<lucidTag:(.*?)/?>", self.handle_tag, content )
        content = re.sub( "<lucidFunction:(.*?)>(.*?)</lucidFunction>", self.handle_function, content )
        print content

    def handle_tag( self, matchobj ):
        tag = matchobj.group(1)
        if tag == "page_msg": # Außnahme, soll noch nicht ersetzt werden.
            return matchobj.group(0)

        return "*%s*" % tag

    def handle_function( self, matchobj ):
        function_name = matchobj.group(1)
        function_info = matchobj.group(2)

        return "++%s,%s++" % (function_name, function_info)
Schön ist allerdings die ausnahme Behandlung nicht...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten