Estou tentando OBTER um URL usando Python e a resposta é JSON. No entanto, quando eu corro
import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html
O html é do tipo str e estou esperando um JSON. Existe alguma maneira de capturar a resposta como JSON ou um dicionário Python em vez de um str.
response.read()
retornando uma string JSON válida?Respostas:
Se o URL estiver retornando dados codificados em JSON válidos, use a
json
biblioteca para decodificar:fonte
response
fornece bytestrings ejson.load()
espera ler uma bytestring. JSON deve ser codificado usando um codec UTF, e o acima funciona para UTF-8, UTF-16 e UTF-32, desde que um codepoint BOM seja incluído para os dois últimos codecs. A resposta que você vincular presume que foi usado UTF-8, o que geralmente está correto porque é o padrão. A partir do Python 3.6, ajson
biblioteca decodifica automaticamente os bytecodes com dados JSON, desde que uma codificação UTF seja usada.requests
biblioteca, que também detecta automaticamente o codec UTF correto para usar nos casos em que o BOM está ausente e nenhum conjunto de caracteres foi especificado no cabeçalho da resposta. Basta usar oresponse.json()
método.urllib , para Python 3.4
HTTPMessage , retornado por r.info ()
fonte
print data
ser incorreto para Python 3. Deveria serprint(data)
.import urllib.request
. Além disso, esse arquivo .json no url não existe mais.fonte
from django.http import JsonResponse return JsonResponse({'key':'value'})
Tenha cuidado com a validação e etc, mas a solução direta é esta:
fonte
fonte
One-liner da biblioteca padrão do Python 3:
fonte
Embora eu ache que já tenha respondido, eu gostaria de adicionar um pouco mais neste
Nota: o objeto passado para json.load () deve suportar .read () , portanto urllib2.urlopen (self.name) .read () não funcionaria. Doamin aprovado deve ser fornecido com protocolo neste caso http
fonte
você também pode obter json usando
requests
o seguinte:fonte
Esta é outra solução mais simples para sua pergunta
onde data é a saída str do código a seguir
fonte
Nenhum dos exemplos fornecidos aqui funcionou para mim. Eles eram para Python 2 (uurllib2) ou aqueles para Python 3 retornavam o erro "ImportError: No module named request". Pesquisei no Google a mensagem de erro e aparentemente requer a instalação de um módulo - o que é obviamente inaceitável para uma tarefa tão simples.
Este código funcionou para mim:
fonte
urllib.urlopen
;urlopen
está nourllib.request
módulo.