Request mehrmals durchführen, wie for Schleife benutzen?

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.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@SeriousRuffy: Du hast hier einen json-kodierten String, den Du wieder mit "json.loads" in ein Dictionary umwandeln kannst.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Danke für dein Feedback. Der Code müsste dann ja so aussehen, richtig?

Code: Alles auswählen

import json
import requests
response = requests.get("blabla")
json_data = json.loads(response.text)
Hallo = json_data[0]["responseBodies"][0].get("status")
print(Hallo)


Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@SeriousRuffy: wenn es richtigt wäre, könntest Du es ja ausprobieren und müßtest nicht fragen.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Jep, war eine blöde Frage;)

Hat nicht auf Anhieb geklappt, aber mit Probieren bin ich auf das richtige Ergebnis gekommen:

Code: Alles auswählen

import requests
response = requests.get("blabla")
data = response.json()
Hallo = data[0]["status"]
print(Hallo)
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen, habe nun grad ein anderes Problem, wo ich nicht weiterkomme

Code: Alles auswählen

import requests
counter = 0
times = 1
for r in range(times):
    response = requests.get("http://192.168.1.52:8080/ws/Admin/JsonApi?partnerId=878&itemId=RANDOM_ITEM&localeCode=ID&languageCode=id&fromDate=2015/02/04&toDate=2015/02/07&roomType=7")
    data = response.json()
    Hallo = data[0]["responseBodies"].get("status")
    print(Hallo)
    if not Hallo:
        counter = counter + 1
print("Missing: " + str(counter))
print("Successful: " + str(times-counter))
Habe die folgende Response (abgekürzt):

debuggerLink': 'blabla',
'statusDetail': 0,
'status': 1,
'responseBodies': ['{
"diagnostic": {
"status": 200,
"elapsetime": "0.1441",
"memoryusage": "4.81MB",
"unix_timestamp": 1421241275,
"confirm": "success",
"lang": "id",
"currency": "IDR"
},
"output_type": "json",


Und jetzt möche ich gern auf den Wert "status": 200 zugreifen, der in den Response Bodies vorhanden ist. Das klappt ja nicht mit der get. Funktion, da es sich nicht um ein Dict. handelt sondern um eine Liste.

Könnt ihr mir Tipps geben, wie ich darauf zugreifen kann?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SeriousRuffy hat geschrieben: Könnt ihr mir Tipps geben, wie ich darauf zugreifen kann?
Schau in der Doku zu Dicts und Listen nach, welche Zugriffe möglich sind. Oder noch besser: Arbeite das Tutorial dahingehend durch! Dort werden die wichtigsten Zugriffe für diese *essenziellen* Datentypen besprochen :-)

(Wirklich, das sind absolute Basics, die man für das Programmieren in Python "drauf haben" muss :!: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hyperion hat geschrieben:
SeriousRuffy hat geschrieben: Könnt ihr mir Tipps geben, wie ich darauf zugreifen kann?
Schau in der Doku zu Dicts und Listen nach, welche Zugriffe möglich sind. Oder noch besser: Arbeite das Tutorial dahingehend durch! Dort werden die wichtigsten Zugriffe für diese *essenziellen* Datentypen besprochen :-)

(Wirklich, das sind absolute Basics, die man für das Programmieren in Python "drauf haben" muss :!: )

Habe das Tutorial durchgearbeitet:)
Mittlerweile weiß ich Bescheid wie ich darauf zugreifen kann, aber komme trotzdem leider nicht weiter

Code: Alles auswählen

import requests
import json
response = requests.get("blabla")
data = response.json()
Hallo = data[0]["responseBodies"][0]
print(Hallo)

Bekomme die folgende Response:
Abgekürzt:
{"diagnostic":{"status":200,"elapsetime":"0.1851","memoryusage":"4.77MB","unix_timestamp":,"confirm":"success","lang":"","currency":""},"output_type":"json","result":[{"hotel_id":"19448661","hotel_description":"Tanah Papua menyimpan banyak kekayaan

Würde jetzt gerne auf die hotel_id oder die hotel_description zugreifen aber er sagt mir leider, das der Text zu lang ist. Ich könnte es jetzt quasi mit einem Delimiter rausfischen, aber das ist ja nicht Sinn der Sache, weil sich der Request bei jeden Zugriff ändern konnte.

Könnt ihr mir Tipps geben, wie ich weiter vorgehen kann? Wäre für jede Hilfe dankbar:)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die folgenden Ausssagen widersprechen sich:
SeriousRuffy hat geschrieben: Habe das Tutorial durchgearbeitet:)
Mittlerweile weiß ich Bescheid wie ich darauf zugreifen kann, aber komme trotzdem leider nicht weiter
SeriousRuffy hat geschrieben: Würde jetzt gerne auf die hotel_id oder die hotel_description zugreifen aber er sagt mir leider, das der Text zu lang ist. Ich könnte es jetzt quasi mit einem Delimiter rausfischen, aber das ist ja nicht Sinn der Sache, weil sich der Request bei jeden Zugriff ändern konnte.
Entweder Du weisst darüber Bescheid, dann kannst Du den Zugriff auch programmieren, oder aber nicht ;-)

Aber ich will mal nicht so sein: Der Wert von "result" ist eine *Liste* von Dictionaries. Ergo musst Du diese Liste durchlaufen und auf jedem Element (welches ja eben ein Dictionary ist), die gewünschten Schlüssel "hotel_id" und "hotel_description" abfragen. Ist doch ganz einfach, oder?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

In der Theorie komme ich ja klar, aber in der Praxis scheitert es;) Aber dennoch großen Dank für dein Feedback:) Bitte weiter um Verständnis, bin immer noch ein blutiger Anfänger

Code: Alles auswählen

import requests
import json
response = requests.get("blabla")
data = response.json()
Hallo = data[0]["responseBodies"][0]
dic = json.loads(data[0]["responseBodies"][0])
print(dic["result"])
Response:
rooms': [{
'total_rate': 1275000,
'room_description': 'MataramSquareHotelberadadipusatkotalombokyangakrabdengankeramaian.HotelmewahiniberlokasidiJalanRSoepraptoNo.21AMataram,
Mataram,
Lombok.Hoteliniberdiridilokasiyangstrategisdanterletak40menitdaribandaraInternasionalLombok.MataramSquaredapatdicapaidalam15menitberkendaradariPantaiSenggigiyangberpasirputihdenganpemandanganpantaiyangindah,
HotelmoderniniterletakdisekitarobyekwisatapopulerKotaLomboksepertiPerpustakaanMataram,
MasjidAtTaqwa,
TamanBudayaMataramyangbisamasukdaftarkunjunganAnda.\n\nHotelmewahyangterdiridaritigalantaiini,
menawarkan44kamaryangberdesainminimalis.Andabisamemilihtipekamaryangsesuaidengankeinginandankebutuhan.AdaduatipekamaryangtersediayaitukamarSuperiordankamarStandard.SetiapkamarnyadilengkapidenganTV,
AC,
kotakpenyimpanan,
sepraiyangbersih,
ruangduduksantai,
danmeja.Setiapkamarmemilikikamarmandipribadiyangdidalamnyaterdapatfasilitasshowerdanperlengkapanmandigratis.AndajugabisamenikmatiWi-Figratisdisetiapkamardanseluruhareahotel.\n\nMataramSquareHoteljugamenawarkanHidanganIndonesia,
Tiongkok,
danInternasionalyangdisajikanolehMandasariRestaurant.AndabisamengisiwaktusantaidenganbermainditamanataubisajugakePantaiSenggigiyangberpasirputih.PijatdanspasiapmemanjakantubuhAndayanglelahsetelahseharianberaktifitas.Layananlaundry,
layananantar-jemputbandara,
areamerokok,
ruangbersantai,
pusatkebugarandanlayanankamar24jamdihotelinisiapmemanjakandanmenemaniAndaselamaberliburdipulauLombok.',
'photo_url': 'http: //www.tiket.com/img/business/s/q/business-square4.s.jpg',
'average_rate_per_night': 425000,
'room_id': '2245',
'room_available': '2',
'with_breakfast': '1',
'room_type': '-AksesInternet-Wifi',





Mein Problem ist, wie ich jetzt zum Beispiel an die 'room_description' komme. Bekomme es nicht hin, obwohl es einfach sein sollte, wie du es beschrieben hast.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was hast Du denn probiert? Wieso testest Du das nicht in einer *Shell*? Genau dafür sind REPLs gut! Hole Dir Deine JSON-Struktur oder paste sie in die Shell hinein. Dann veruschst Du Schritt für Schritt, Dich an die gewünschte Stelle zu "hangeln". Also Schlüssel-Zugriff bei Dictionaries und Index-Zugriffe bei Listen... mehr ist es doch nicht :!:

Mal als Beispiel in ipython:

Code: Alles auswählen

In [1]: data = {"result": [{"foo": "foo value", "bar": "bar value"}, {"foo": "no
ch ein foo", "bar": "noch ein bar"}]}

In [2]: from pprint import pprint

In [3]: pprint(data)
{'result': [{'bar': 'bar value', 'foo': 'foo value'},
            {'bar': 'noch ein bar', 'foo': 'noch ein foo'}]}

In [4]: data["result"]
Out[4]:
[{'bar': 'bar value', 'foo': 'foo value'},
 {'bar': 'noch ein bar', 'foo': 'noch ein foo'}]

In [5]: data["result"][0]
Out[5]: {'bar': 'bar value', 'foo': 'foo value'}

In [6]: data["result"][1]
Out[6]: {'bar': 'noch ein bar', 'foo': 'noch ein foo'}

In [7]: data["result"][1]["foo"]
Out[7]: 'noch ein foo'
Ehrlich, ist das jetzt so schwer? Es sind doch nur genau *zwei* verschiedene Arten des Zugriffs, wobei diese syntaktisch sogar identisch sind...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Danke für dein Feedback!:)
Antworten