Analyse de la réponse HTTP en Python
je veux manipuler l'information à cette url . Je peux l'ouvrir avec succès et lire son contenu. Mais ce que je veux vraiment faire, c'est jeter tout ce que je ne veux pas, et manipuler ce que je veux garder.
y a-t-il un moyen de convertir la chaîne en dict pour que je puisse itérer dessus? Ou dois-je simplement l'analyser tel quel (str type)?
from urllib.request import urlopen
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
print(response.read()) # returns string with info
4 réponses
ceci a été résolu.
quand j'ai imprimé response.read()
j'ai remarqué que b
était préprendu à la chaîne (par exemple b'{"a":1,..
). Le " b " signifie bytes et sert de déclaration pour le type d'objet que vous manipulez. Depuis, je savais qu'une chaîne de caractères pouvait être convertie en un dict en utilisant json.loads('string')
, j'ai juste dû convertir le type octet en un type de chaîne de caractères. Je l'ai fait en décodant la réponse à utf-8 decode('utf-8')
. Une fois c'était dans un type string mon problème a été résolu et j'ai pu facilement itérer sur le dict
.
Je ne sais pas si c'est la façon la plus rapide ou la plus "pythonique" d'écrire ceci mais cela fonctionne et il y a toujours du temps plus tard d'optimisation et d'amélioration! Code complet pour ma solution:
from urllib.request import urlopen
import json
# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)
# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)
print(json_obj['source_name']) # prints the string with 'source_name' key
Si quelqu'un arrive à trouver ce grâce à Google, j'espère que cette aide. Le meilleur conseil que je puisse donner est de lire attentivement vos erreurs et de faire très attention à la sortie que vous recevez.
vous pouvez également utiliser la bibliothèque de requêtes de python à la place.
import requests
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = requests.get(url)
dict = response.json()
Maintenant, vous pouvez manipuler le "dict" comme un dictionnaire python.
json
fonctionne avec du texte Unicode en Python 3 (le format JSON lui-même est défini uniquement en termes de texte Unicode) et donc vous devez décoder les octets reçus en réponse HTTP. r.headers.get_content_charset('utf-8')
obtient votre le codage des caractères:
#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r, \
io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
result = json.load(file)
print(result['headers']['User-Agent'])
il n'est pas nécessaire d'utiliser io.TextIOWrapper
ici:
#!/usr/bin/env python3
import json
from urllib.request import urlopen
with urlopen('https://httpbin.org/get') as r:
result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])
je suppose que les choses ont changé en python 3.4. Cela a fonctionné pour moi:
print("resp:" + json.dumps(resp.json()))