Hilfe skripten, Denkanstoß gesucht

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
ellenbogen
User
Beiträge: 5
Registriert: Donnerstag 12. März 2015, 08:29

Hallo alle zusammen! :D

Ich stehe vor einem Rätsel und hoffe, dass mir jemand hier den richtigen Schubs in die Richtige Richtung geben kann, damit ich das Rätsel lösen kann. :D

Also ich hab die Aufgabe ein Script zu schreiben mit folgenden Kriterien:

Wenn man die Modellnummer eines Gerätes eingibt soll man die Wartungsvertragslänge aufscheinen.

Code: Alles auswählen

#! /usr/bin/python

import json

servicetag = "345ABC"
apikey = "1234"
url = "https://sanbox...." % (servicetag, apikey)

r = requests.get("https://sandbox..." , auth ("user" , "pass"))
Das ist so mal mein grober Plan nur leider bin ich nicht so erfahren im skripten und wäre über jeden Tipp dankbar, der mir meine Blokaden öffnet, wie ich jetzt das ganze am Besten angehe.
Ich arbeite im vi editor.

Mir fehlt irgendwie der Anfang mit welcher Schleife ich das Beste Resultat erreiche. Beziehungsweise ob ich mit dem groben Plan am richtigen Weg bin.

Danke danke danke

LG
Zuletzt geändert von Hyperion am Donnerstag 12. März 2015, 09:11, insgesamt 1-mal geändert.
Grund: Code in Python Code Tags gesetzt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@ellenbogen
Zuerst würde ich mir einmal überlegen, in welchen Datentyp Du denn die Informationen ``Modellnummer:Wartungsvertragslänge`` steckst. In Python stehen Dir verschiedene Datentypen zur Verfügung.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ellenbogen hat geschrieben: Wenn man die Modellnummer eines Gerätes eingibt soll man die Wartungsvertragslänge aufscheinen.
Die zentrale Frage lautet doch: Wie kann man an diese Information kommen? Wenn man das weiß, weiß man auch, in welcher Form diese Informationen kommen. Dazu hast Du *nichts* geschrieben - wir sehen nur *implizit*, dass Du diese Infos offenbar über einen Webservice beschaffen kannst. Dieser wird ja hoffentlich eine vernünftige Datenstruktur zurückliefern (JSON? XML?), aus welcher man mit geeigneten Bordmitteln (``json``-Modul, ``xml.etree.ElementTree``-Modul / ``lxml``-Modul) die gewünschte Info auslesen kann.

Ob man beim letzten Schritt eine "Schleife" braucht, kann man so noch gar nicht sagen... dazu ist das "big picture" zunächst noch zu unvollständig.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ellenbogen
User
Beiträge: 5
Registriert: Donnerstag 12. März 2015, 08:29

@ mutetella

ja, darüber hab ich mir auch schon Notizen gemacht und hab mir folgendes gedacht:

ich würde es mit .append zusammenfügen sprich:

servicetag.append[len(servicetag):url]

bzw.

device = []
device.append(servicetag)
device.append(url)

aber das würde es mir ja nur nebeneinander die Ergebnisse aussprucken, deshalb bin ich von zweiterem wieder abgekommen.

Was ich mich frage ist, ob das Phyton quasi "reicht" wenn ich es nur so (servicetag.append[len(servicetag):url]) zusammen schreibe und es aus dem url das richtig rausfiltert. Irgendwie stehe ich hier vor einer riesen Mauer :?: :?
ellenbogen
User
Beiträge: 5
Registriert: Donnerstag 12. März 2015, 08:29

@ Hyperion
Die Wartungsvertragslänge kann ich zur Zeit anhand der url und dem api key auslesen im Browser.

Die Endinformation soll auch im Browser auslesbar sein (laut Kollege)

Es geht eigentlich quasi um die zusammenlegung von Gerätemodell(Seriennummer) und Wartungsvertragslänge, so dass man nur die Nummer eingeben muss und die Vertragslänge ausbekommt.

Ja, unvollständig triffts gut, ich hab viele Baustellen und finde den Klebstoff nicht ders zusammenbringt.

Dafür blick ich noch zu wenig durch bei Python.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ellenbogen hat geschrieben: Dafür blick ich noch zu wenig durch bei Python.
Das hat bisher eigentlich noch gar nichts mit Python zu tun! Du musst doch erst einmal ein klares Bild vor Augen haben, was Du für die Lösung brauchst. Das fehlt mir hier total. Bisher präsentierst Du nur Bruchstücke, aber genau da, wo man *präzise* Angaben braucht, verschweigst Du diese.
ellenbogen hat geschrieben: Die Wartungsvertragslänge kann ich zur Zeit anhand der url und dem api key auslesen im Browser.
Was heißt das denn genau? *Wie* werden die Infos dargestellt? Wird da eine HTML-Seite ausgeliefert? Wenn ja, musst Du offenbar für die Lösung einen HTML-Parser verwenden, mit dem Du das HTML-Dokument parsen und die Info extrahieren kannst.

Wie soll denn die Eingabe erfolgen? Da die Ausgabe per Web erfolgen soll, gilt das für die Eingabe vermutlich auch? Wenn ja, musst Du (später) das ganze noch in eine Webapplikation verpacken. Dafür würde ich Dir ein simples Webrahmenwerk wie Bottle oder Flask empfehlen.

Das sind alles Infos, die Du uns und vor allem Dir selber strukturiert darstellen musst. Nur so bekommst Du einen Überblick, kannst die Technologien auswählen und das ganze in sinnvolle Teilprobleme zerlegen, die Du *separat* angehen kannst ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ellenbogen
User
Beiträge: 5
Registriert: Donnerstag 12. März 2015, 08:29

Code: Alles auswählen

<a:DellAsset>
<a:AssetParts i:nil="true"/>
<a:CountryLookupCode>3***</a:CountryLookupCode>
<a:CustomerNumber>2118***</a:CustomerNumber>
<a:IsDuplicate>false</a:IsDuplicate>
<a:ItemClassCode>`-002</a:ItemClassCode>
<a:LocalChannel>I****</a:LocalChannel>
<a:MachineDescription>POWEREDGE R710</a:MachineDescription>
<a:OrderNumber>2644****</a:OrderNumber>
<a:ParentServiceTag i:nil="true"/>
<a:ServiceTag>522RB5J</a:ServiceTag>
<a:ShipDate>2012-04-25T19:00:00</a:ShipDate>
<a:Warranty>
<a:EndDate>2016-04-26T18:59:59</a:EndDate>
<a:EntitlementType>INITIAL</a:EntitlementType>
<a:ItemNumber>710-*****</a:ItemNumber>
<a:ServiceLevelCode>4U</a:ServiceLevelCode>
<a:ServiceLevelDescription>ProSupport for End Users and 4hr Mission Critical</a:ServiceLevelDescription>
<a:ServiceLevelGroup>99999</a:ServiceLevelGroup>
<a:ServiceProvider i:nil="true"/>
<a:StartDate>2012-04-25T19:00:00</a:StartDate>
</a:Warranty>
so sehen die Informationen des Links aus die mir zur Zeit zur Verfügung stehen.

Das ist eine von der Firma Dell zur Verfügung gestellte Seite.

So sieht sie bei einer Ausgabe mit xml aus. Bei Json ist es viel unübersichtlicher.

Der Kollege möchte jetzt wenn er die Seriennummer in den Browser eingibt automatisch dabei steht EndDate.

Vielen Dank für deine Geduld :)

Ich seh da leider immer noch keine Struktur in meinem Kopf nur 100te Notizen aber vielleicht konnte ich dir ein paar Fragen beantworten.
BlackJack

@ellenbogen: Wenn Du XML bekommst brauchst Du also einen XML-Parser. Die Standardbibliothek hat da beispielsweise `xml.etree.ElementTree`. Wobei ich meistens `lxml.etree` bevorzuge, was die gleiche ”Grund-API” hat, aber mehr Funktionalität.

Falls Dell da auch JSON anbietet würde ich das bevorzugen. Das Format ist ”leichtgewichtiger” und einfacher als XML. Wenn das JSON welches ausgeliefert wird in einem Texteditor unübersichtlich aussieht dann kannst Du das mit entsprechenden Werkzeugen übersichtlicher formatieren. Jeder Editor der von sich aus oder per Plugin JavaScript ”hübsch” formatieren kann, eignet sich dazu. Notfalls parst Du das mit dem `json`-Modul aus der Standardbibliothek und lässt es Dir mit Zeilenumbrüchen und Einrückung vom `json`-Modul wieder speichern.

Wenn das JSON tatsächlich als 'application/JSON' oder ähnlich vom Server kommt, dann hat das Antwort-Objekt von `requests` sogar eine Methode (`json()`) die das schon fertig geparst zurück gibt.

Wenn das mit dem Abfragen klappt, Du also eine Funktion hast der man die Seriennummer übergeben kann und die das Enddatum zurück gibt, kannst Du Dich als nächstes mit dem Tutorial von Bottle oder Flask beschäftigen.
ellenbogen
User
Beiträge: 5
Registriert: Donnerstag 12. März 2015, 08:29

Ja es bietet Json an, und ich hatte es auch vor zu verwenden.

Ich hab zwar keine Ahnung wie ich json im vi editor formatieren soll, werde mich aber mal herumgooglen

Ich sag mal zwischenzeitlich danke und hoffe, dass irgendwann das licht angeht :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ellenbogen hat geschrieben: Ich hab zwar keine Ahnung wie ich json im vi editor formatieren soll, werde mich aber mal herumgooglen
Wieso willst Du das formatieren? Ich dachte das wird geliefert‽

Python hat das eingebaute ``json``-Modul. Damit ist das Parsen sehr einfach, weil es direkt in die Standarddatenstrukturen wie Dictionaries und Listen transformiert wird.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Um es lesen zu können. Die Ansage war ja das JSON total unübersichtlich sei. Ich vermutete deshalb einfach mal das der Webserver das komplett in einer Zeile und mit möglichst wenig ”whitespace” ausliefert. Und dann kann man ja als Mensch in der Tat schlecht die Struktur erkennen, darum der Tipp von mir mit dem ”hübsch” formatieren lassen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah... ok. :D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten