ich möchte gerne einen Wert zwischen zwei HTML Elementen über "Regular expression" auslesen. Kämpf mich schon seit mehreren Stunden durch die Dokumentation, aber ich bekomme es einfach nicht gebacken.
Das ganze sieht so aus:
<br>MeinWert 1,00 Euro </br>
Wobei sich der Inhalt auch mal ändern kann (bsp: Eurowert fällt weg)
Zwischen den br Elementen sind ein Haufen Leerzeichen. Hab es schon mit BeautifulSoup probiert, aber der HTML Content ist einfach so extrem schlecht aufgebaut, sodass es nicht funktioniert hat.
HTML gehört zu den kontextfreien Sprachen. Reguläre Ausdrücke lassen sich aber nur sinnvoll auf die regulären Sprachen anwenden und somit nicht für HTML benutzen.
Mit dem HTML-Parser (in deinem Fall BeautifulSoup) kannst du dir den Parse-Tree erstellen und mit dem relativ leicht umgehen.
Du könntest alle Inhalte durchiterieren und den jeweiligen Inhalt mit regulären Ausdrücken überprüfen. Die leerzeichen zwischen den <br> und </br> interessieren dich dann nicht mehr.
Ich hab noch nie viel mit regulären Ausdrücken gearbeitet aber der hier sollte ein paar Fälle abdecken.
Code:
MeinWert(:)? (-)?\d(,|.)\d\d( )?(Euro)?
Damit kannst du unteranderem folgende Werte finden
Quote:
MeinWert 1,00 Euro
MeinWert 1.11 Euro
MeinWert: 1.00 Euro
MeinWert -1,00
MeinWert: 1.00
MeinWert: 1,00
...
<strong>MeinDatum 01.11.2015<br><br>Putin € 5,00<br><br>Dies ist ein Satz<br><br>Ein sehr kurzer Satz<br><br>Richtig scheiße formatiert 1337 €<br><br>NeuerWert (ohne Preis)<br><br>Blabla blabla 5,00 €<br><br>
HTML5 forever<br><br>http://elitepvpers.com<br><br>asdasdasd<br><br>Dies ist ein extra langer Satz mit allen Zeichen die mir gerade einfallen ~'#æ<br><br>Ich glaube das geht gar nicht<br><br>Endlich fertig 5,00 €
</strong>
Hab mal ein paar Phantasie Werte eingefügt, aber so sieht es aus
Edit: Jeder Wert zwischen den br's soll ausgelesen werden, und der letzte zwischen <br> und <strong> auch
Wie es ablaufen muss kann ich mir auch vorstellen, aber es scheitert an der Umsetzung
Die genaue Umsetzung ist stark von deinem HTML anhängig. Du könntest den Inhalt jedes <br> tags oder was auch immer das da oben sein soll, nach spezifischen Werten überprüfen.
Z.B. nach Währungszeichen, Zahlenwerten oder beidem.
Weiß nicht was genau du extrahieren möchtest, gehe davon aus den Zahlenwert mit dem Währeungszeichen?
Wenn dein HTML eine mindest Struktur hat wie Zahlenwerte nur vorhanden wenn ein € Zeichen da ist oder das € immer hinter den Zahlenwert oder der Zahlenwert da es sich um Währeung handelt immer nur zwei Nachkommastellen hat etc. muss man den Code mit mehr oder weniger Überprüfungen schreiben.
Hier ein Beispiel:
Code:
def check_for_integer(zeilen):
""" Sucht nach Integer in Zeile. Gibt Liste aus Tuple von Zahl und Zeile zurück. """
funde = []
for zeile in zeilen:
for wort in [w.replace(',', '') for w in zeile.split(' ')]:
try:
wert = int(wort)
funde.append((wert, zeile))
except:
pass
return funde
def check_for_string(zeilen, werte):
""" Checkt ob Wörter in Zeilen Werte enthalten. Ignoriert Groß-Kleinschreibung. """
funde = []
for zeile in zeilen:
if [wort for wort in zeile.split(' ') if any(wert in wort.lower() for wert in werte)]:
funde.append(zeile)
return funde
text = u"""<strong>MeinDatum 01.11.2015<br><br>Putin € 5,00<br><br>Dies ist ein Satz<br><br>Ein sehr kurzer Satz<br><br>Richtig scheiße formatiert 1337 €<br><br>NeuerWert (ohne Preis)<br><br>Blabla blabla 5,00 €<br><br>
HTML5 forever<br><br>http://elitepvpers.com eUro<br><br>asdasdasd<br><br>Diestz mit allen Zeichen die mir gerade einfallen ~'#æ<br><br>Ich glaube das geht gar nicht<br><br>Endlich fertig 5,00 €
</strong>"""
# teilt text in zeilen zwischen br tags
zeilen = [zeile for zeile in text.split('<br>')]
werte = (u'€', u'euro', u'dollar', u'$')
wert_funde = check_for_string(zeilen, werte)
print(wert_funde)
int_funde = check_for_integer(zeilen)
print(int_funde)
int_und_wert_funde = check_for_integer(wert_funde)
print(int_und_wert_funde)
Also ich kann dir nur davon abraten mit re aus HTML Tags auszulesen!
Wie bereits erwähnt wurde solltest du dafür BeautifulSoup benutzen(ich kann mir schlecht vorstellen das es nicht geht..)!
Hier ein kleines Beispiel um dein o.g. beispiel auszulesen:
Code:
import bs4
# Dein HTML TAG
string = "<br>MeinWert 1,00 Euro </br>"
# Parsen
soup = bs4.BeautifulSoup(string, "html.parser")
# TAG inhalt ausgeben
print soup.text
#>> MeinWert 1,00 Euro
Es ist hässlich, unübersichtlich, schwerer zu verstehen/warten, und bei evtl. kleinen Fehlern in HTML (die durchaus auftreten können) nicht mehr wirklich anwendbar.
Es ist hässlich, unübersichtlich, schwerer zu verstehen/warten, und bei evtl. kleinen Fehlern in HTML (die durchaus auftreten können) nicht mehr wirklich anwendbar.
Wir reden aber über sehr wenige Zeilen an Code. Ich finde nicht, dass da das eine besser oder schlechter zu warten ist als das andere.
Bei kleinen Fehlern im HTML kann der Code auch mit einem HTML Parser schief gehen. Man muss festlegen, welche Fehler auftreten könnten - und die kann man dann auch im Regexp berücksichtigen.
Quote:
Hier noch eine detailierte Beschreibung: html - RegEx match open tags except XHTML self-contained tags - Stack Overflow
Das bezieht sich aber auf HTML allgemein. Der Aufbau in Post #5 ist regulär.
Wir reden aber über sehr wenige Zeilen an Code. Ich finde nicht, dass da das eine besser oder schlechter zu warten ist als das andere.
Wenn du das hier:
Code:
(^<strong>|<br>)\s*(.+?)\s*(<\/strong>$|<br>)
als wartungsfreundlich bezeichnest, dann kennst du wohl einfach die Bedeutung dieses Wortes nicht.
Quote:
Originally Posted by algernong
Bei kleinen Fehlern im HTML kann der Code auch mit einem HTML Parser schief gehen. Man muss festlegen, welche Fehler auftreten könnten - und die kann man dann auch im Regexp berücksichtigen.
Also ich muss hier nichts festlegen, bs4 kommt damit "einfach so" zurecht:
expression must have integral or enum type 03/16/2014 - C/C++ - 5 Replies void info(SOCKET *accetta, std::string id, int client) {
std::string info = EncryptGamePacket("req_info" + "1" + id);
for (int i = 0; i <= utenti; i++) send(accetta, info.c_str(), info.size(),0);
}
Someone know why i get error : expression must have integral or enum type ?
[QUEST] Regular Expression 10/17/2013 - Metin2 Private Server - 2 Replies Hi guys, I want do this regex strings. Function name is string.match() from Lua.
I want use to my quest.
How do we do?
Thank you..
Good works..
Edit:
[RegEx] Regular Expression Problem 02/23/2013 - General Coding - 5 Replies ERLEDIGT!
Aloha zusammen,
habe ein kleines Problem mit RegEx. Habe mich bisher leider wenig damit beschäftigt..
Nun weiß ich auch warum... vll kann mir einer von euch helfen...
Hier mal zum Aufbau:
Quelauszug der durchsucht werden muss:
09.02.2011 Online With Crack 2.76 ibot expression 02/28/2011 - DarkOrbit - 15 Replies Friends bakıyorumki everyone was for the licensed user to the bot problem in attracting more than I have searched all over but the demand could not look at and with ibot karşınızdayım photoshop 2.76 crack for expression will be the thank you can get there by looking at the button tıklarsanızda sevinirim ...
l1.link must download:http://www.freecap.ru/files/freecap_setup _eng.exe
NEW IKB.EXE:Multiupload.com - upload your files to multiple file hosting sites!
İBot 2.76 mutlaka...
Microsoft Expression Web 4 01/07/2011 - General Art - 4 Replies Guten Tag,
Also ich habe ein Problem mit der oben genannten Software.
Heute ist endlich das Paket eingetroffen, und ich habe es wunderbar installiert.
Nur leider funktioniert 1 Programm nicht.
Microsoft Expression Web 4
Beim öffnen kommt eine Fehlermeldung, danach sucht es nach einer Lösung.
Im Anhang befindet sich das Bild zum genannten Problem.