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.
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

Aber vielleicht hat der OP ja irgendwelche sinnvollen Gründe dafür. Vielleicht mag er die uns sogar nennen
er nennt: ich habe in den letzten Tagen ein paar 100 Zeilen Code ausprobiert (ja, totales rumgestümper), darunter auch urllib wie in meinem ersten Post zu sehen war. Ich kann zur Zeit weder die Unterschiede noch die Wirksamkeiten beurteilen. Außerdem handelt es sich nicht um einen PC, eventuell soll die Lösung später auch anderen zugänglich gemacht werden, deshalb möchte ich nichts zusätzliches installieren müssen für die Lösung
"a" funktioniert nicht.
die Beispielzeile aus meinem ersten Post ist einem laufenden Script entnommen, also das es nicht funktioniert entspricht schlicht nicht der Wahrheit


ansonsten kann ich nur erstaunt feststellen: es wurde hier sehr oft auf den Button 'Antworten' geklickt und einiges an Text eingegeben, geantwortet hat mir außer dem ersten jedoch niemand. Schade um die Zeit der Poster (hilft weder mir noch ihnen).
Ich habe viele Stunden im Internet gesucht und eine Menge erklärender Seiten gefunden, leider alles englisch und somit für mich schlecht bis gar nicht verständlich (und solange ich keinen Zugang zur Funktionsweise Linux/Python finde kann ich mir da auch nichts zusammenreimen wie es mir bei php, VB und anderem bisher immer gelungen ist)

ich habe hier nicht nach einer fertigen Lösung gefragt, kein komplettes Script erbeten - da könnt ich die Reaktionen verstehen
Es kann allerdings auch sein, das entgegen älteren Beiträgen in diesem Board inzwischen nur noch Leuten geholfen wird, welche Python beherrschen (das sollte man mir aber mitteilen, dann melde ich mich hier eben wieder ab da im falschen Board)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

shadow07 hat geschrieben:
Aber vielleicht hat der OP ja irgendwelche sinnvollen Gründe dafür. Vielleicht mag er die uns sogar nennen
er nennt: ich habe in den letzten Tagen ein paar 100 Zeilen Code ausprobiert (ja, totales rumgestümper), darunter auch urllib wie in meinem ersten Post zu sehen war. Ich kann zur Zeit weder die Unterschiede noch die Wirksamkeiten beurteilen. Außerdem handelt es sich nicht um einen PC, eventuell soll die Lösung später auch anderen zugänglich gemacht werden, deshalb möchte ich nichts zusätzliches installieren müssen für die Lösung
urllib2 ist Teil der Standardbibliothek, schon... seit ewigkeiten. Gibt keinen Grund dagegen... Es ist sogar kompatibel mit Python 3.0
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

och menno

Code: Alles auswählen

#!/usr/bin/python
 
#from twisted.web.client import getPage
from re import sub, split, search, findall, IGNORECASE
 
seite = urllib.urlopen("http://www.test.php")
x = findall('\d+\d+[,.]\d+|\d+',seite)
print x
gibt: File "/usr/lib/python2.5/re.py", line 167, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer

der Such-String ist direkt abgeschrieben, an vielen Stellen ähnlich gesehen, der kann doch einfach nicht fehlerhaft sein[/quote]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``seite`` ist nun mal kein String. Den Inhalt der Seite gibt es mit ``seite.read()``. Siehe Dokumentation.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shadow07
User
Beiträge: 43
Registriert: Sonntag 22. Februar 2009, 16:29

soweit bin ich nun:

Code: Alles auswählen

#!/usr/bin/python

from re import sub, split, search, findall, IGNORECASE
import urllib
 
seite = urllib.urlopen("http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Obermarchtal_e3.php")
seite2 = seite.read()
seite.close()

such = "odd preis_his"
anfpos = seite2.find(such)

nextpos = anfpos + 15


x = findall('\d{2}\,\d{2}',seite2)

print "2000 Liter, neuer Preis: " + x[0] + ",alter Preis: " + x[1] + " gesamt: " + str(float(x[0].replace(',','.'))*20) + "0"
print "2500 Liter, neuer Preis: " + x[2] + ",alter Preis: " + x[3] + " gesamt: " + str(float(x[2].replace(',','.'))*25) + "0"
print "3000 Liter, neuer Preis: " + x[4] + ",alter Preis: " + x[5] + " gesamt: " + str(float(x[4].replace(',','.'))*30) + "0"
print "3500 Liter, neuer Preis: " + x[6] + ",alter Preis: " + x[7] + " gesamt: " + str(float(x[6].replace(',','.'))*35) + "0"
print "4000 Liter, neuer Preis: " + x[8] + ",alter Preis: " + x[9] + " gesamt: " + str(float(x[8].replace(',','.'))*40) + "0"
der code macht was er soll, obwohl mit Sicherheit Verrenkungen drin sind die Profis besser wissen (?)

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?
wie bekomme ich zwei Stellen nach dem Komma ohne selbst eine '0' hinzuschreiben?
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