web-dev-qa-db-fra.com

Analyse de la réponse HTTP en Python

Je veux manipuler l'information à THIS url. Je peux avec succès l'ouvrir 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.

Existe-t-il un moyen de convertir la chaîne en dict afin de pouvoir l'itérer? Ou dois-je simplement l'analyser tel quel (type str)?

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
26
Colton Allen

Cela a été résolu.

Lorsque j’ai imprimé response.read(), j’ai remarqué que b était ajouté à la chaîne (par exemple b'{"a":1,..). Le "b" représente les octets et sert de déclaration pour le type d'objet que vous manipulez. Depuis, je savais qu'une chaîne pouvait être convertie en dict en utilisant json.loads('string'), il me suffisait de convertir le type d'octet en un type de chaîne. Je l'ai fait en décodant la réponse à utf-8 decode('utf-8'). Une fois que c’était dans un type string, mon problème était résolu et j’étais capable d’itérer facilement une itération sur dict.

Je ne sais pas si c'est la manière la plus rapide ou la plus 'pythonique' d'écrire cela, mais cela fonctionne et il y a toujours du temps après optimisation et 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 découvre cela via Google, j'espère que cela aidera. Le meilleur conseil que je puisse vous donner est de lire attentivement vos erreurs et de porter une attention particulière au résultat que vous recevez.

55
Colton Allen

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
Shaurya Mittal

json fonctionne avec le texte Unicode dans Python 3 (le format JSON lui-même n’est défini qu’en termes de texte Unicode) et vous devez donc décoder les octets reçus dans la réponse HTTP. r.headers.get_content_charset('utf-8') récupère votre encodage de 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
jfs

Je suppose que les choses ont changé dans Python 3.4. Cela a fonctionné pour moi:

print("resp:" + json.dumps(resp.json()))
0
Ajay Gautam