url aus config-Datei in Variable + Sonderzeichen

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

ich versuche, aus einer configdatei eine url zu lesen und dann mit urllib anzuwählen

so steht sie in der config und so wird sie mir auch angezeigt wenn ich sie da raushole und ausgebe:

Code: Alles auswählen

            f = open(self.configfile,"r")
            line2 = f.readline()

ausgegeben wird:
"http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Obermarchtal_e3.php"

nur wenn ich dann

Code: Alles auswählen

seite = urllib.urlopen(line2)
klappt das nicht - vermutlich werden irgendwie die Sonderzeichen in der url vermanscht? (ich habe in den Beiträgen gesucht, habs aber nicht gefunden bzw. nicht kapiert)
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

also wenn ich diese url in den brouser jage dan kommt da nix raus
aktueller heizölpreis mit grapg zb hier
http://www.tecson.de/pheizoel.htm
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hast du es mal mit den echten Umlauten getestet statt mit der Ersetzung?

Übrigens kann man die Konfiguration direkt in Python-Dateien erledigen, da brauch man keine flache Konfigurationsdatei, die man erst umständlich parsen muss.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nimm doch einfach eine Configdatei im INI-Format und verwende sie über den ConfigParser.

@sea-life: Bei mir tut die URL.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

so dann hab ich da mal ein beispiel für das einlesen des aktuellen Preises

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")
    text =str(eingelesen)
    neusplit = re.split("<td",text)
    for x in neusplit:
        if "preis_akt" in x:
            linesplit = re.split(">",x)
    argsplit = re.split("Â",linesplit[1])
    preis = argsplit[0]

except urllib2.URLError:
    preis = "Unknown"

print "Aktueller Heizoelpreis fuer 100 liter" , preis
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sea-live hat geschrieben:so dann hab ich da mal ein beispiel für das einlesen des aktuellen Preises
Da finde ich meinen Code aber besser und komplett Regex-frei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

ist auch ne möglichkeit und liefert alle zahlen zu den literpreisen
hier das ganze noch etwas kürzer

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

vielen Dank den Profis hier (das erst mal vorweg)

das Problem mit der config war ganz einfach, das ich die URL in Anführungszeichen drin hatte, ohne funktioniert es hervorragend

mein erstes Produkt in Python funktioniert erstmal (ist natürlich sehr verbesserungswürdig, insbesondere die Verwendung von html5lib und ElementTree, da muss ich erst mal begreifen wie das tut und vor allem wie ich es per ipkg installieren lassen kann)

und hier mein Projekt, ein Plugin für die Dreambox unter Enigma2:

Code: Alles auswählen

# -*- coding: utf-8 -*-
#
# Heizoelpreise
# http://www.esyoil.com/
#
# 0.02
#
#
# Enigma2 Plugin
#
# Author: fs-cl
#

import os, sys

from Plugins.Plugin import PluginDescriptor
from twisted.web.client import getPage
from twisted.internet import reactor
from Screens.Screen import Screen
from Screens.Console import Console
from Components.ActionMap import ActionMap
from Components.Label import Label
from Components.ScrollLabel import ScrollLabel
from Components.Sources.List import List
from enigma import eTimer
from re import sub, split, search, match, findall
from string import find, atoi, strip
import urllib

class HeizoelMain(Screen):


    skin = """
        <screen position="110,83" size="980,390" title="%s" >
            <widget name="details1" position="5,2" size="980,60" font="Regular;30" halign="left" />
            <eLabel position="0,390" size="980,3" backgroundColor="white" />
            <widget name="details" position="5,55" size="980,330" font="Regular;30" halign="left" />
            <widget name="statuslabel" position="5,390" size="980,0" font="Regular;12" halign="left"/>
        </screen>""" % "Heizoel                          V0.1a"

    def ok(self):
            self.exit()


    def __init__(self, session):
            self.loadinginprogress = False
            self.session = session
            self.skin = HeizoelMain.skin
            Screen.__init__(self, session)
            self["details1"] = ScrollLabel("")
            self["details"] = ScrollLabel("")
            self["statuslabel"] = Label("")
            self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ChannelSelectBaseActions"],
                {
                    "ok":	self.exit,
                    "cancel": self.exit,
                }, -1)



            self.configfile = pluginpath + "/heizoel.cfg"

			try:
            	f = open(self.configfile,"r")
            	line2 = f.readline()
 			except:
				line2 ="http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Stuttgart_e2.php"


 

            #seite = urllib.urlopen("http://www.esyoil.com/heiz%C3%B6lpreise/heiz%C3%B6l_Obermarchtal_e3.php")
            seite = urllib.urlopen(line2)
            seite2 = seite.read()
            seite.close()
            x = findall('\d{2}\,\d{2}',seite2)

            diff2000 = str ('%+.2f' %((float(x[1].replace(',','.')))-(float(x[0].replace(',','.')))))
            diff2500 = str ('%+.2f' %((float(x[3].replace(',','.')))-(float(x[2].replace(',','.')))))
            diff3000 = str ('%+.2f' %((float(x[5].replace(',','.')))-(float(x[4].replace(',','.')))))
            diff3500 = str ('%+.2f' %((float(x[7].replace(',','.')))-(float(x[6].replace(',','.')))))
            diff4000 = str ('%+.2f' %((float(x[9].replace(',','.')))-(float(x[8].replace(',','.')))))

            sum2000 = str ('%4.2f' %(float(x[1].replace(',','.'))*20))
            sum2500 = str ('%4.2f' %(float(x[3].replace(',','.'))*25))
            sum3000 = str ('%4.2f' %(float(x[5].replace(',','.'))*30))
            sum3500 = str ('%4.2f' %(float(x[7].replace(',','.'))*35))
            sum4000 = str ('%4.2f' %(float(x[9].replace(',','.'))*40))

            z0 = "Menge: Gesamtpreis\tEuro/100L (gestern / Diff.)"
            z20= "2000 Liter: " + sum2000 + "\t" + x[1] + " ( " + x[0] + "  /  " + diff2000 + " )\n\n"
            z25= "2500 Liter: " + sum2500 + "\t" + x[3] + " ( " + x[2] + "  /  " + diff2500 + " )\n\n"
            z30= "3000 Liter: " + sum3000 + "\t" + x[5] + " ( " + x[4] + "  /  " + diff3000 + " )\n\n"
            z35= "3500 Liter: " + sum3500 + "\t" + x[7] + " ( " + x[6] + "  /  " + diff3500 + " )\n\n"
            z40= "4000 Liter: " + sum4000 + "\t" + x[9] + " ( " + x[8] + "  /  " + diff4000 + " )\n"
            menux = z0
            bereich= z20 + z25 + z30 + z35 + z40
            self["details"].setText(bereich)
            self["details1"].setText(z0)
            #self["statuslabel"].setText(line2)


    def exit(self):
            self.close()


								
#############################						
									
def main(session, **kwargs):
    session.open(HeizoelMain)
								
def Plugins(path,**kwargs):
    global pluginpath
    pluginpath = path
    return PluginDescriptor(
        name="Heizoelpreise", 
        description="Heizoelpreise", 
        icon="heizoel.png",
        where = PluginDescriptor.WHERE_PLUGINMENU,
        fnc=main)
die URL ist in der heizoel.cfg abgelegt und kann somit abgeändert werden
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du willst Dich dringend mit Listen vertraut machen! "sum2000" oder "diff3000" verraten mir das ;-)

Dann säubere Deinen Code mal von den ganzen unnötigen imports!

Desweiteren wird bei längerem Code-Schnipseln empfohlen, das ganze in ein pastebin auszulagern, etwa Lodge it!
Antworten