|
You last visited: Today at 01:57
Advertisement
Python Regular expression
Discussion on Python Regular expression within the General Coding forum part of the Coders Den category.
11/01/2015, 18:26
|
#1
|
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
|
Python Regular expression
Hi,
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.
freundliche Grüße
freewayc
|
|
|
11/01/2015, 19:02
|
#2
|
elite*gold: 0
Join Date: Jul 2009
Posts: 211
Received Thanks: 137
|
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
...
|
|
|
|
11/01/2015, 19:17
|
#3
|
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
|
Danke für deine schnelle Antwort, aber "MeinWert" war nur als Beispiel gedacht. Schlussendlich steht zwischen dem <br> irgendein random Wert
|
|
|
11/01/2015, 19:31
|
#4
|
elite*gold: 0
Join Date: Jul 2009
Posts: 211
Received Thanks: 137
|
Kannst du mal einen Auszug der besagten stellen aus dem HTML-Dokument geben?
|
|
|
11/01/2015, 19:39
|
#5
|
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
|
Quote:
<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
|
|
|
11/01/2015, 19:57
|
#6
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Also ich würde den Strong Tag etrahieren, dann nach <br> Splitten, zeilen trimmen, leere Zeilen entfernen und dann Zeile für Zeile parsen
|
|
|
11/01/2015, 21:08
|
#7
|
elite*gold: 0
Join Date: Sep 2011
Posts: 60
Received Thanks: 4
|
Quote:
Originally Posted by warfley
Also ich würde den Strong Tag etrahieren, dann nach <br> Splitten, zeilen trimmen, leere Zeilen entfernen und dann Zeile für Zeile parsen
|
Wie es ablaufen muss kann ich mir auch vorstellen, aber es scheitert an der Umsetzung
|
|
|
11/01/2015, 21:43
|
#8
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Für den Strong tag könntest du das Pattern:
Code:
<strong>(.*?)<\/strong>
verwenden. Bei den br tags dann entsprechend.
|
|
|
11/01/2015, 23:17
|
#9
|
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
|
Wieso nicht irgendwie so:
Quote:
|
(^<strong>|<br>)\s*(.+?)\s*(<\/strong>$|<br>)
|
|
|
|
11/02/2015, 11:25
|
#10
|
elite*gold: 56
Join Date: Oct 2010
Posts: 3,409
Received Thanks: 1,219
|
Quote:
Originally Posted by FreewayC
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)
|
|
|
11/23/2015, 18:09
|
#11
|
elite*gold: 21
Join Date: Feb 2012
Posts: 943
Received Thanks: 709
|
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
|
|
|
11/23/2015, 20:29
|
#12
|
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
|
Quote:
|
Also ich kann dir nur davon abraten mit re aus HTML Tags auszulesen!
|
Wieso rätst du davon ab?
|
|
|
11/23/2015, 21:31
|
#13
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by algernong
Wieso rätst du davon ab?
|
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.
Hier noch eine detailierte Beschreibung:
|
|
|
11/23/2015, 22:18
|
#14
|
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
|
Quote:
|
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.
|
|
|
11/23/2015, 22:50
|
#15
|
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
|
Quote:
Originally Posted by algernong
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:
Code:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<htm@)($*><body><table <tr><td>hi</tr></td></body><html")
>>> print soup.prettify()
<htm>
<body>
<table>
<tr>
<td>
hi
</td>
</tr>
</table>
</body>
</htm>
|
|
|
 |
Similar Threads
|
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.
|
All times are GMT +2. The time now is 01:57.
|
|