[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