2016-09-23 7 views
-1

Ich bin ziemlich neu mit JSON. Mein Code besteht darin, Daten von einer Website zu extrahieren, die einen API-Schlüssel benötigt. Die Information extrahiert haben. Ich versuche, die Informationen zu gelangen, die in Sohn durch dieses Format codiert ist (hier ist ein Beispiel):Zugriff auf Daten aus einer JSON-Datei

[{"number":31705,"name":"31705 - CHAMPEAUX (BAGNOLET)","address":"RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET","latitude":48.8645278209514,"longitude":2.416170724425901},{"number":10042,"name":"10042 - POISSONNIÈRE - ENGHIEN","address":"52 RUE D'ENGHIEN/ANGLE RUE DU FAUBOURG POISSONIERE - 75010 PARIS","latitude":48.87242006305313,"longitude":2.348395236282807}] 

Wie greife ich auf die verschiedene Daten im JSON-Code? Dies ist der Code, den ich mit gekommen bin:

import requests 

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{station_number}?contract={contract_name}&api_key HTTP/1.1') 

Ich glaube, dass meine Anfrage eine Antwort formuliert hat, die in der „Antwort“ liegt „Ordner“, die von der Website zu meinem Computer gesendet wurde:

print(reponse.headers) 
print(reponse(2,/'latitude') 

Ich versuche in jedem Element des JSON-Codes auf die Information der Breite zuzugreifen - die 2 stellt das zweite Element der Liste und die Breite den Wert des Wertes dar, auf den ich innerhalb des Elements der JSON-Liste zugreifen möchte. Aber ich kann es nicht schaffen. Der Fehler, den ich bekomme, ist ein Syntaxfehler.

Wie behebe ich es? Ich möchte auf den gesamten Wert jedes Strings jedes Mitglieds des Objekts 'Antwort' zugreifen.

UPDATE n ° 1:

Mein neuer Code ist:

import json 
import requests 
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1') 
data = json.loads(response.content) 
print(data) 

erhalte ich jedoch den Fehler:

Traceback (most recent call last): 
    File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 27, in <module> 
data = json.loads(response.content) 
    File "/Users/someone/miniconda3/lib/python3.5/json/__init__.py", line 312, in loads 
s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'bytes' 

UPDATE n ° 2:

meinen neuen Code ist:

Allerdings bekomme ich den Fehler:

Traceback (most recent call last): 
File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 30, in <module> 
latitude = data[2]['latitude'] 
KeyError: 2 

Bedeutet es, dass Antwort leer ist?

UPDATE n ° 3:

reponse.content 

die Antwort ist folgende:

b'{ "error" : "Unauthorized" }' 

Was ist das Problem?

UPDATE n ° 4:

mein neuer Code ist:

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1') 

data = json.loads(response.content.decode('utf-8')) 
print(reponse.headers) 
print(reponse.content) 

das Ergebnis:

{'Content-Length': '48', 'Content-Encoding': 'gzip', 'Server': 'Apache-Coyote/1.1', 'Date': 'Fri, 23 Sep 2016 19:39:25 GMT', 'Connection': 'close', 'Content-Type': 'application/json'} 
b'{ "error" : "Unauthorized" }' 

so die Antwort auf meine Anfrage nicht leer ist, aber ich habe nicht die Berechtigung, darauf zuzugreifen. Wie kann ich das lösen?

FINAL UPDATE:

Der neue und Arbeitscode lautet:

import json 

import requests 

r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0') 

response_json = r.json() 

print (response_json['name']) 

und das Ergebnis ist:

31705 - CHAMPEAUX (BAGNOLET) 
+0

Was versuchen Sie mit 'print (reponse (2,/'Breite')', weil sie einen Schließbügel 'fehlt) zu erreichen,' und '/ 'latitude'' Argument ist seltsam. –

+0

Ich versuche in jedem Element des JSON-Codes auf die Information der Breite zuzugreifen - die 2 repräsentiert das zweite Element der Liste und die Breite den Namen des Wertes, auf den ich innerhalb des Elements der JSON-Liste zugreifen möchte. Aber ich kann es nicht schaffen. –

+0

könnten Sie überprüfen, was der Wert von "response.content" ist? –

Antwort

1

Sie Ihre json Daten umwandeln könnte dict und dann zugreifen wie Wörterbuch. Ich glaube, es sollte etwas wie

data = json.loads(response.content.decode('utf-8'))

+0

funktioniert nicht. Sie sagt: Traceback (letzter Anruf zuletzt): Datei "/ Benutzer/jemand/Desktop/TIPE 2016: 17/Programm TIPE 2016: 2017.py ", Zeile 24, in data = json.loads (response.content) Datei" /Users/someone/miniconda3/lib/python3.5/json/__init__. py ", Zeile 312, in Lasten s .__ Klasse __.__ name__)) TypeError: das JSON-Objekt muss str sein, nicht 'Bytes' –

+0

@ElliottOhayon Ja, damit der Inhalt der Arbeit vom String-Typ sein soll. –

+0

Ihr Authentifizierungs-Token ist nicht festgelegt.Das ist der Grund, warum Sie Fehler bekommen. –

0

Anfragen sein, einen eingebauten JSON-Decoder hat, so gibt es keine Notwendigkeit, die json Bibliothek zu verwenden:

import requests 

response = requests.get(url) 
data = response.json() 

Basierend auf den Angaben zu Ihrer Frage " data "könnte eine Liste von dicts sein, die den Breitengrad enthalten. So die erste zu extrahieren könnte sein:

Aber Sie werden wahrscheinlich zuerst mit der Antwort interaktiv spielen wollen, um sicherzustellen, dass.

1

Sie haben Ihre URL versaut. Ich bin mir nicht sicher, was ist HTTP/1.1 Suffix, aber ID gehört definitiv nicht hierher. Auch alle Parameter in gekräuselten Klammern sehen aus.

import requests 
r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0') 
response_json = r.json() 
print response_json 

Dieser Code-Schnipsel gibt:

{u'status': u'OPEN', u'contract_name': u'Paris', u'name': u'31705 - CHAMPEAUX (BAGNOLET)', u'bonus': True, u'bike_stands': 50, u'number': 31705, u'last_update': 1474660046000, u'available_bike_stands': 49, u'banking': True, u'available_bikes': 1, u'address': u'RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET', u'position': {u'lat': 48.8645278209514, u'lng': 2.416170724425901}} 

Um es zusammenzufassen, response_json ist jetzt ein Standard-Python dict, aus denen Daten zugegriffen werden kann Standard dict-Protokoll.

print response_json['status'] # prints OPEN 
Verwandte Themen