modul re float aus text grappen

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nimm doch lxml.html statt der regulären Ausdrücke. Ist eh sinnvoller wenn man HTML scraped.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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 €'
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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'
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Antworten