Seite 1 von 1
Meta-Daten in HTML per RE suchen...
Verfasst: Montag 13. Dezember 2004, 08:28
von jens
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?
Verfasst: Montag 13. Dezember 2004, 15:38
von XT@ngel
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

Verfasst: Montag 13. Dezember 2004, 17:28
von jens
Super Idee!
Frage: Wazu das Parser.close() ???
Verfasst: Montag 13. Dezember 2004, 18:53
von XT@ngel
.close() setzt den Parser wieder zurück
MfG
Andreas
Verfasst: Dienstag 14. Dezember 2004, 07:14
von jens
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
Verfasst: Dienstag 14. Dezember 2004, 12:12
von XT@ngel
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
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
Verfasst: Dienstag 14. Dezember 2004, 18:50
von jens
XT@ngel hat geschrieben:Meinst Du die Methode close() ?
[...]
Hab ich wohl an schmarn erzählt
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...