[Python] Regex Hilfe


chmee

verstaubtes inventar
Premium-User
Moin die Herrschaften,

hat sich Jemand von Euch schon mit der XBMC-Plugin-Schnittstelle beschäftigt ?
Wie dem auch sei, das Problem basiert auf Python und primär auf der Erkennung eines bestimmten Abschnitts. Ich habe einfach zu selten mit Regex zu tun.

Gegeben : Eine HTML-Seite, auf welcher mehrere dieser Teile vorkommen..
HTML:
..
<div class="line even">
 <div class="title">
   <a href="awz.php?film_id=12687&player=1">Lars und Stella wolllen ihr Versteckspiel beenden</a>
 </div>
 <div class="season">0.</div> 
 <div class="number">686.</div>
 <div class="time">29.05.2009 19:05</div>
 <div class="buy">
    <a href="awz.php?container_id=24307&player=1">kostenlos</a>
 </div>
 <div class="vote"></div>
 <div class="favorite"></div>
</div>
..
Gesucht : Ein Regex, der alle diese HTML-Teile rausmatcht. Essentiell ist es, sich an dem Begriff kostenlos im div buy zu orientieren. Gebraucht werden title, time, number und natürlich die href ( egal welche, die id's sind anders, führen aber zum gleichen Playercontent).

line even darf als Erkenner nicht benutzt werden, da die Zeilen sich mit even und odd abwechseln und kostenpflichtiger Content genauso definiert ist.

Mein Ansatz zu matchen wäre nach folgender schriftlicher Anweisung :
Wenn kostenlos, dann den Text davor bis title.
Danach kann ich mir ja noch ne Regex schreiben, die die mir gewünschten Einzelteile rausmatcht.

Danke für jede Hilfe..

mfg chmee

Ach ja, wie benutze ich die Python-Regex, damit Zeilenumbruch auch gestattet ist ? DOTALL ? Oder davor alle \n rauslöschen ?
 

deepthroat

Erfahrenes Mitglied
Hi.

Reg. Ausdrücke sind dafür nicht so wirklich geeignet. Willst du denn nicht lieber das HTMLParser Modul verwenden?

Oder kannst du davon ausgehen, das der Code valides XML ist? Dann würde sich natürlich XML mit XPath anbieten.

Was ich auf die Schnelle mit regex machen konnte:
Python:
r = re.compile('''<div\s[^>]*class=["']title.*?</div>\s*(?:<div.*?</div>\s*)*''', re.DOTALL)

kostenlos = re.compile('''<div[^>]+class\s*=\s*["']buy.*>kostenlos<''', re.DOTALL)

s = file('test.html').read()

res = [ x for x in r.findall(s) if kostenlos.search(x) ]
Gruß
 

chmee

verstaubtes inventar
Premium-User
Deepthroat, danke erstmal (bevor ichs vergesse). Ich hatte keine Zeit, um es zu testen und daran weiter zu werkeln. Zumindest seh ich in Deinem Script, dass \s auch in Python benutzt werden kann. Das ist fein :) Beizeiten melde ich mich einfach nochmal, denn das Thema ist sogar für einen weiteren Thread gut :D

Ach ja, glaubst Du, dass ich mit dem HTMLParser wirklich schneller sein könnte ?
Es geht um das Parsen von Links und Infos von den freien Streams auf rtlnow. Wenn man sich die anschaut, bietet sich von Serie zu Serie ein leicht geänderter Aufbau. Manchmal wird zwischen freien und kostenpflichtigen Streams unterschieden, andere Serien sind komplett frei, dafür aber auf mehreren Seiten verteilt. Naja, wenn es Dich zufällig packt, kannst Du was dazu erzählen..

mfg chmee

p.s.: Querverweis zum übergreifenden Thema : http://www.tutorials.de/forum/coders-talk/341893-rtlnow-stream-abgreifen.html
 

Neue Beiträge