Analizzare la risposta http in Python
-
21-12-2019 - |
Domanda
Voglio manipolare le informazioni su questo URL.Posso aprirlo con successo e leggere il suo contenuto.Ma quello che voglio davvero fare è buttare fuori tutte le cose che non voglio, e per manipolare le cose che voglio mantenere.
C'è un modo per convertire la stringa in un trick in modo che io possa iterare su di esso?O devo solo analizzarlo come è (tipo 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
. Soluzione
Quando ho stampato response.read()
ho notato che b
è stato prepredicato alla stringa (ad esempio b'{"a":1,..
).La "B" rappresenta i byte e funge da dichiarazione per il tipo di oggetto che stai maneggiando.Dal momento che, sapevo che una stringa potrebbe essere convertita in un dett utilizzando json.loads('string')
, ho dovuto solo convertire il tipo di byte in un tipo di stringa.Lo ha fatto decodificare la risposta a UTF-8 decode('utf-8')
.Una volta che si trovava in un tipo di stringa il mio problema è stato risolto e sono stato facilmente in grado di iterare sopra il dict
.
Non so se questo è il modo più veloce o più "pitone" di scriverlo, ma funziona e c'è sempre tempo dopo l'ottimizzazione e il miglioramento!Codice completo per la mia soluzione:
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
. Altri suggerimenti
È anche possibile utilizzare invece la biblioteca delle richieste di Python.
import requests
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = requests.get(url)
dict = response.json()
.
Ora puoi manipolare il "DET" come un dizionario Python.
json
funziona con il testo Unicode in Python 3 (JSON Format stesso è definito solo in termini di testo Unicode) e quindi è necessario decodificare byte ricevute nella risposta HTTP. r.headers.get_content_charset('utf-8')
Ottiene la codifica del personaggio:
#!/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'])
.
Non è necessario utilizzare io.TextIOWrapper
qui:
#!/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'])
. Immagino che le cose siano cambiate in Python 3.4.Questo ha funzionato per me:
print("resp:" + json.dumps(resp.json()))
.