findall für Anfänger

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.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

shadow07 hat geschrieben:der code macht was er soll, obwohl mit Sicherheit Verrenkungen drin sind die Profis besser wissen (?)
Was macht denn der Code in Zeile 9 bis 15?
shadow07 hat geschrieben:interessant für mich wäre: wie kann ich das komma ersetzten durch einen Punkt (zum berechnen) und anschließend wieder mit Komma austausche ohne ellenlange Code?
Das ist die falsche Frage. Was du machen willst ist es in Fließkommazahlen zu konvertieren und anzuzeigen. Eigentlich nicht einmal in ``float``s sondern besser in ``Decimal``s.

Ich glaube das zeige ich dir besser am Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from decimal import Decimal
from itertools import izip

import lxml.html
from lxml.cssselect import CSSSelector

document = lxml.html.parse('http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Obermarchtal_e3.php')
amounts = (int(item.attrib['value'])
        for item in CSSSelector('td.menge > input')(document))
old_prices = (Decimal(item.text[:-2].replace(',', '.'))
        for item in CSSSelector('td.preis_his')(document))
current_prices = (Decimal(item.text[:-2].replace(',', '.'))
        for item in CSSSelector('td.preis_akt')(document))

for amount, old, new in izip(amounts, old_prices, current_prices):
    overall = (amount / 100) * new
    print "%d Liter, neuer Preis %.2f, alter Preis %.2f, gesamt %.2f" % (
            amount, new, old, overall)
Wie du siehst greife ich nicht auf irgendwelche Zahlen zu (dein Code würde kaputtgehen wenn der Betreiber entscheidet vor die Preisliste einen Abschnitt wie "Bestellen Sie unseren Ölstandsmesser für nur 10,99!" hinzuzufügen) sondern auf die die als menge, historischer Preis und aktueller Preis ausgezeichnet sind. Diese Strings wandle ich in die entsprechenden Datentypen um (jeweils Integer und Decimal) damit man damit bequem rechnen kann und mache eine Schleife über die gefundenden Werte, die ich über Stringformatierung ausgebe. Vielleicht kannst du dir ja einige Inspirationen abschauen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

Was macht denn der Code in Zeile 9 bis 15?
erwischt :wink: sind schon entfernt, ich habs erst nach dem posten bemerkt und war zu faul den Post zu ändern

dein Vorschlag sieht sehr aufgeräumt aus, so kenn ich es eigentlich aus meine anderen Projekten, aber:

File "plugin4.py", line 3, in <module>
from decimal import Decimal
ImportError: No module named decimal

ich kann und will auf keinen Fall zusätzliche Komponenten installieren, das ganze ist ein Projekt um Python und Pluginprogrammierung für die Box zu lernen (das mit dem Öl war eine Idee weil es uns gerade interessiert, ich habe später mehr allgemeininteressante Sachen vor). Meine Plugins (so sie denn jemals laufen) will ich der Gemeinschaft zu Verfügung stellen und otto-normal-ich benutze nur-Bediener kann meist keine Module installieren, außerdem ist der Platz oft sehr begrenzt
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

decimal — Decimal fixed point and floating point arithmetic
New in version 2.4.
Das heisst: Wenn du das nicht "nstalliert" hast, solltest du schleunigst ein aktuelles Python(2.6) benutzen (oder zumindest 2.5, wenn es Probleme mit Libraries gibt)
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

nun ja, selbst wenn es im 2.5er (das ist das bei mir laufende soweit ich weiß) dabei ist und nur anders importiert werden müßte, lxml.cssselect ist mir Sicherheit nicht dabei (und dieses Thema ist ja zur Genüge am Anfang des Freds durchgekaut worden
sicher, mit nem xml-Parser wäre es deutlich einfacher auf Informationen dieser Art zuzugreifen (und ich hätte da schon noch tolle Ideen), aber meine Gründe hatte ich ja mehrfach dargelegt

edit: soeben gefunden: wäre da was mit 'minidom' zu machen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

shadow07 hat geschrieben:nun ja, selbst wenn es im 2.5er (das ist das bei mir laufende soweit ich weiß) dabei ist und nur anders importiert werden müßte, lxml.cssselect ist mir Sicherheit nicht dabei (und dieses Thema ist ja zur Genüge am Anfang des Freds durchgekaut worden
sicher, mit nem xml-Parser wäre es deutlich einfacher auf Informationen dieser Art zuzugreifen (und ich hätte da schon noch tolle Ideen), aber meine Gründe hatte ich ja mehrfach dargelegt
Wenn du Python 2.5 hast (wo ElementTree in die Stdlib aufgenommen wurde), kannst du html5lib mitliefern (sind ja auch nur paar Dateien) und mit html5lib kann man ElementTree-Bäume erstellen in denen man dann die Preise zusammensuchen kann. Nicht ganz so komfortabel, weil ElementTree keine so praktischen Selektoren unterstützt, aber meiner Meinung nach immer noch besser als mit regulären Ausdrücken oder Minidom (wenn man aber unbedingt minidom haben will - html5lib kann auch das).

minidom alleine hat zwei Probleme: erstens ist es nur für valides XML gedacht. Damit kannst du dann die meisten HTML-Seiten gar nicht erst öffnen weil selbst korrektes HTML kein valides XML ist. Und die meisten Seiten haben nicht einmal fehlerfreies HTML. Also wirst du um html5lib in dem Fall nicht herumkommen. Zweites Problem ist die recht unangenehme API von minidom oder eigentlich von DOM generell.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

habe gerade mal einen Abfrage gestartet, vieleicht ist ja doch was dabei was man verwenden könnte: (python-xml?)
libpython2.5-1.0 - 2.5.1-ml3 -
python-codecs - 2.5.1-ml3 -
python-core - 2.5.1-ml3 -
python-crypt - 2.5.1-ml3 -
python-crypto - 1.9a6-r1 -
python-datetime - 2.5.1-ml3 -
python-email - 2.5.1-ml3 -
python-fcntl - 2.5.1-ml3 -
python-imaging - 1.1.5-r1 -
python-io - 2.5.1-ml3 -
python-lang - 2.5.1-ml3 -
python-logging - 2.5.1-ml3 -
python-math - 2.5.1-ml3 -
python-mime - 2.5.1-ml3 -
python-netclient - 2.5.1-ml3 -
python-netserver - 2.5.1-ml3 -
python-pickle - 2.5.1-ml3 -
python-pyopenssl - 0.6-r0 -
python-re - 2.5.1-ml3 -
python-shell - 2.5.1-ml3 -
python-stringold - 2.5.1-ml3 -
python-threading - 2.5.1-ml3 -
python-xml - 2.5.1-ml3 -
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also wenn du Python 2.5.1 hast, dann nimm doch das + html5lib (700 KB Quelltext, aber da kannst du wohl auch noch einiges Löschen was du nicht brauchst falls es dir zu groß ist) und arbeite mit ElementTree (was in Python 2.5 mitgeliefert ist). Da brauchst du kein ``python-xml``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten