Seite 1 von 1

modul re float aus text grappen

Verfasst: Donnerstag 26. Februar 2009, 14:18
von sea-live
servus ich versuch mal mir aus dem internet einen preis der täglich aktuallisiert wird zu grabben
ich hätte gerne akt als float == 48,75
und bekomm das nicht hin
bitte um hilfe

Code: Alles auswählen

# -*- coding: cp1252 -*-
import re
text="""<tr>
<td class="odd menge"><input class="text menge" maxlength="6" type="text" name="his_tab_conf[m1]" value="2000" /></td>
<td class="odd es"><input class="text es" maxlength="2" type="text" name="his_tab_conf[es1]" value="1" /></td>
<td class="odd preis_his">47,71 €</td>
<td class="odd preis_akt">48,75 €</td>
<td class="odd diff up">+1,04 €</td>
<td class="odd bestellen">
<a href="http://www.esyoil.com/heizoel_rechner.php?s13_plz=76676&es_abfr=1&menge_abfr=2000&test=ok&tk_herkunft=opti" title="Direkt-Bestellung" rel="nofollow">
<img src="/images-Dateien/einkaufswagen.png" alt="Direkt-Bestellung" />
</a>
</td>
</tr>"""
preis = re.findall(">(\d{2})", text)
print preis

Verfasst: Donnerstag 26. Februar 2009, 14:51
von Leonidas
Nimm doch lxml.html statt der regulären Ausdrücke. Ist eh sinnvoller wenn man HTML scraped.

Verfasst: Donnerstag 26. Februar 2009, 16:59
von helduel
Moin,

Code: Alles auswählen

preis = re.findall('preis_akt">(\d+,\d{2})', text)
Das \d+ sorgt dafür, dass der Preis auch ein- oder mehr als zweistellig sein darf.

Gruß,
Manuel

Verfasst: Donnerstag 26. Februar 2009, 19:16
von sea-live
danke
nun flutscht das

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-

import re
import urllib2
from BeautifulSoup import BeautifulSoup

try:
    url = urllib2.urlopen("http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Graben-Neudorf_e3.php")
    soup = BeautifulSoup(url.read(),
                         convertEntities=BeautifulSoup.HTML_ENTITIES)

    eingelesen =  soup.find(text=re.compile("Menge")).findNext("tr")
    preis = re.findall('preis_akt">(\d+,\d{2})', str(eingelesen))

except urllib2.URLError:
    preis = "Unknown"

print "Aktueller Heizoelpreis fuer 100 liter" , preis

Verfasst: Donnerstag 26. Februar 2009, 20:00
von snafu
Wenn du eh schon BeautifulSoup nutzt, dann kannst du auch direkt nach der Klasse suchen:

Code: Alles auswählen

soup.find('td', {'class' : 'odd preis_akt'}).string

Verfasst: Donnerstag 26. Februar 2009, 20:01
von Hyperion
snafu hat geschrieben:Wenn du eh schon BeautifulSoup nutzt, dann kannst du auch direkt nach der Klasse suchen:
Wo bleibt denn da der "Spaß" mit den RegExps? :twisted:

Verfasst: Donnerstag 26. Februar 2009, 20:09
von snafu
Die muss man dann wohl nutzen, wenn man der Ausgabe den letzten Schliff verpassen will:

Code: Alles auswählen

In [76]: soup.find('td', {'class' : 'odd preis_akt'}).string
Out[76]: u'49,10 €'

Verfasst: Donnerstag 26. Februar 2009, 20:38
von derdon
Und zwar so:

Code: Alles auswählen

In [1]: preis_akt = u'49,10 €'

In [2]: import re

In [3]: m = re.search(r'\d+?,\d+', preis_akt)

In [4]: m.group()
Out[4]: u'49,10'

Verfasst: Donnerstag 26. Februar 2009, 22:01
von sea-live
DANKE snafu das beispiel mit den klassen wird für manche sicherlich hilfreich sein da die meisten php auf diese weise aufgebaut sind

SUPI Leut's