[Python-de] HTML mit RegEx filtern
Karl Pflästerer
khp at pflaesterer.de
Do Dez 21 22:36:52 CET 2006
On 21 Dez 2006, stefan.antonelli at operun.de wrote:
[...]
> Ja das glaub ich gerne und genau das bekomme ich auch zu spüren... Hier mein
> Vorschlag:
>
> text = re.sub(r'<img(.*?)>', lambda mat: mat.group(0).split(' ')[1][5:-1],
> text)
>
> Das dropped zumindest schon mal alles was an uninteressanten Attributen,
> verstümmelt oder konform, enthalten ist und gibt, sofern nach dem img auch die
> src folgt, die URL korrekt zurück.
Da sind noch einige Verbesserungsmöglichkeiten. Vor allem ist .* gierig;
wenn in deinem String 2 Image-Tags nacheinander kommen paßt der Ausdruck
auf beide. Wie wäre es mit:
text = r"""<img src='foo' alt=bar> bla blub <img alt="dd" border=0 src="baz"><img src=foobar ""><img src=nochwasanderes '<' atrr="wert">"""
reg = re.compile(r"""(?x)
(<img\s+) # Ein img Tag
(?:
(src\s*=\s*['"]?[^'"]*['"]?) # src Attribut mit oder ohne Anführungszeichen
# wir prüfen nicht ob sie passen
|"[^"]*?" # oder ein Attribut in doppelten Anf.
|'[^']*?' # oder in einfachen
|[^'">] # oder etwas anderes
)* # das ganze beliebig oft
>""" # bis wir eine schließende spitze Klammer finden;
)
reg.sub(r'\1\2>',text)
# der Rückgabewert ist <img src='foo'> bla blub <img src="baz"><img src=foobar ><img src=nochwasanderes >
Ich bin mir nicht sicher, ob dies schon alle Sonderfälle abdeckt
(wahrscheinlich eher nicht); du siehst, es geht, aber nicht trivial;
angeregt zu obigem Konstrukt wurde ich übrigens durch ein Beispiel in
Mastering Regular Expressions von Friedl (wenn man mit regexp arbeiten
möchte/muß ist dies nahezu Pflichtlektüre).
Karl