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
.

È stato utile?

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()))
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top