Analisando resposta HTTP em Python
-
21-12-2019 - |
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
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()))