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
23
demandé sur Colton Allen 2014-04-14 03:36:06

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.

50
répondu Colton Allen 2014-04-15 01:32:47

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.

9
répondu Shaurya Mittal 2017-08-01 21:14:11

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'])
6
répondu jfs 2017-05-23 11:47:30

je suppose que les choses ont changé en python 3.4. Cela a fonctionné pour moi:

print("resp:" + json.dumps(resp.json()))
0
répondu Ajay Gautam 2015-10-30 18:44:32