Pergunta

Quero manipular as informações em ESSE url.Posso abri-lo com sucesso e ler seu conteúdo.Mas o que eu realmente quero fazer é jogar fora todas as coisas que não quero e manipular as que quero guardar.

Existe uma maneira de converter a string em um ditado para que eu possa iterá-la?Ou preciso apenas analisá-lo como está (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
Foi útil?

Solução

Quando eu imprimi response.read() eu percebi isso b foi pré-preparado para a string (por ex. b'{"a":1,..).O “b” significa bytes e serve como uma declaração para o tipo de objeto que você está manipulando.Desde então, eu sabia que uma string poderia ser convertida em um dict usando json.loads('string'), só tive que converter o tipo byte em um tipo string.Eu fiz isso decodificando a resposta para utf-8 decode('utf-8').Uma vez que estava em um tipo de string, meu problema foi resolvido e consegui iterar facilmente sobre o dict.

Não sei se esta é a maneira mais rápida ou mais 'pythônica' de escrever isso, mas funciona e sempre há tempo para otimização e melhoria!Código completo da minha solução:

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

Outras dicas

Você também pode usar a biblioteca de solicitações do python.

import requests

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'    
response = requests.get(url)    
dict = response.json()

Agora você pode manipular o "dict" como um dicionário python.

json funciona com texto Unicode em Python 3 (o próprio formato JSON é definido apenas em termos de texto Unicode) e, portanto, você precisa decodificar os bytes recebidos na resposta HTTP. r.headers.get_content_charset('utf-8') obtém a codificação de caracteres:

#!/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'])

Não é necessário usar io.TextIOWrapper aqui:

#!/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'])

Acho que as coisas mudaram no python 3.4.Isso funcionou para mim:

print("resp:" + json.dumps(resp.json()))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top