Meta-Daten in HTML per RE suchen...

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
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 13. Dezember 2004, 08:28

Hab mir hier eine Variante zusammengebasteln um Meta-Tags in HTML-Dateien rauszufiltern:

Code: Alles auswählen

MetaTyp = "name"
MetaTypDesc = "Keywords"
regex='(?i)<meta *%(typ)s=["%(X)s]%(desc)s["%(X)s] *content=["%(X)s](.+)["%(X)s]' % {
    "typ"  : MetaTyp,
    "desc" : MetaTypDesc,
    "X"    : "'"
}
print re.findall(regex, text)
Ich habe es extra mit dem %(X)s gemacht, weil ich gern Meta-Angaben die mit " oder mit ' eingeschlossen sind finden will... Jetzt könnte ich es einfach so machen:

Code: Alles auswählen

regex='''(?i)<meta *%(typ)s=["']%(desc)s["'] *content=["'](.+)["']'''
Was auch funktioniert, allerdings bringt es SciTE's SyntaxHightlighting durcheinander :(

Hat jemand eine elegantere Lösung?
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Montag 13. Dezember 2004, 15:38

Code: Alles auswählen

from sgmllib import SGMLParser
import urllib

class MetaContentParser(SGMLParser):
	def start_meta(self, eigenschaften):
                print eigenschaften

Fp = urllib.urlopen("http://www.drweb.de/verwaltung/index.shtml")
Parser = MetaContentParser()
Parser.feed(Fp.read())
Fp.close()
Parser.close()
Also das wäre meine 5 min Lösung, ist zwar etwas übertrieben und noch ausbaufähig aber läuft soweit :)
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 13. Dezember 2004, 17:28

Super Idee!

Frage: Wazu das Parser.close() ???
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Montag 13. Dezember 2004, 18:53

.close() setzt den Parser wieder zurück
MfG
Andreas
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 14. Dezember 2004, 07:14

Noch ne Frage: Gilt das eigentlich für jede Klasse, oder ist es eine besonderheit des Parsers???

Hab mit den Parser noch mal näher angeschaut:

Code: Alles auswählen

import sgmllib

class MetaContentParser(sgmllib.SGMLParser):

    from htmlentitydefs import entitydefs # replace entitydefs from sgmllib

    def __init__(self):
        self.inBody = False
        sgmllib.SGMLParser.__init__(self, 0)
        self.metaData = []
        self.data = ""
        self.hrefData = []

    def start_a( self, hrefInfo ):
        self.hrefData.append( hrefInfo )

    def start_meta(self, metaData):
        self.metaData.append(metaData)

    def handle_data( self, data ) :
        if data=="\n": return
        self.data = self.data + data

    def handle_entityref(self, name):
        if self.entitydefs.has_key(name):
            self.data += self.entitydefs[name]
        else:
            self.data += "&"+name+";"

    def get_meta( self ):
        return self.metaData

    def get_a( self ):
        return self.hrefData

    def get_data( self ):
        return self.data

f = open("index.html")

Parser = MetaContentParser()
Parser.feed(f.read())
f.close()
print Parser.get_data()

for i in Parser.get_meta(): print i

for i in Parser.get_a(): print i
Parser.close()
Eine nette Sache... Was ich nicht verstehe, wo kommen die ganzen Leerzeichen her? Deswegen bei def handle_data() das if data=="\n": return
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Dienstag 14. Dezember 2004, 12:12

jens hat geschrieben:Noch ne Frage: Gilt das eigentlich für jede Klasse, oder ist es eine besonderheit des Parsers???
Meinst Du die Methode close() ?
Also ich hab nochmal in der doc geschaut, und die Methode close() der
SGMLParser Klasse startet self.goahead(end)

Unter close() steht im docstring "Handle the remaining data"
# Internal -- handle data as far as reasonable. May leave state
# and data to be processed by a subsequent call. If 'end' is
# true, force handling all data as if followed by EOF marker.

Hab ich wohl an schmarn erzählt :roll:

Eine nette Sache... Was ich nicht verstehe, wo kommen die ganzen Leerzeichen her? Deswegen bei def handle_data() das if data=="\n"
Leider kann ich hier den Code nicht ausprobieren, aber wenn ich daheim bin kann ich mir des anschaun. Aber wieso ist das so ungewöhlich für dich
das auch Steuerzeichen gelesen werden?

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

Dienstag 14. Dezember 2004, 18:50

XT@ngel hat geschrieben:Meinst Du die Methode close() ?
[...]
Hab ich wohl an schmarn erzählt :roll:
Also braucht man das .close() nicht wirklich... Da fällt mir ein, man kann doch auch del(class) eine Instanz "löschen"...
Aber wieso ist das so ungewöhlich für dich
das auch Steuerzeichen gelesen werden?
Nein, nein... Ich wundere mich nur, das viele Leerzeilen vorhanden sind... Wenn ich diese nicht mit if data=="\n": return rausfiltere... Aber das wird schon seine richtigkeit haben, nehme ich an...
Antworten