Regex - Linktext

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
Timbo
User
Beiträge: 5
Registriert: Dienstag 6. Juli 2010, 17:43

Hallo,

ich muss aus einem String, der mehrere Links enthält, den Linktext extrahieren:

Code: Alles auswählen

'<div id="links"><a href="/abc/def">ABC</a>&#160;|&#160;<a href="/ghi/jkl">JKL</a>&#160;|&#160;<a href="/ghi/jgk/index.php?id=12">JKL blah</a></div>'
Ich habe u.a. mit folgendem Code versucht, den Linktext der Strings auszufiltern:
>>> r = re.compile("""<a href=".*">(?P<linktext>.*)</a>""")
>>> r.findall(string)
['JKL blah']
Damit erhalte ich zwar einen Linktext, allerdings nur den des letzten Links. Das Problem scheint wohl mit dem ersten .* zusammenzuhängen.

Könnte mir jemand sagen, wie ich auch die anderen beiden erhalte?

Gruß
Tim
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Das liegt daran, dass * greedy sucht. Mit *? geht es:

Code: Alles auswählen

re.compile(r'<a href=".*?">(.*?)</a>').findall(txt)
Schönen Gruß,

brb
Timbo
User
Beiträge: 5
Registriert: Dienstag 6. Juli 2010, 17:43

Super, dankeschön!
"(non)greedy" kannte ich noch nicht.

Gruß
Tim
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Natürlich darf hier der Standard Hinweis nicht fehlen, dass man HTML nicht mit RegExps parsen sollte, sondern mit einem HTML-Parsern (lxml, html5lib, ...).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten