Python urllib2: получить ответ JSON с URL-адреса


91

Я пытаюсь ПОЛУЧИТЬ URL-адрес с помощью Python, а ответ - JSON. Однако когда я бегу

import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html

HTML имеет тип str, и я ожидаю JSON. Есть ли способ записать ответ как JSON или словарь python вместо str.


1
Является ли response.read()возвращать допустимую строку JSON?
Мартейн Питерс

Да, это действительная строка JSON, просто или введите str, а не dict
Deepak B

Если это JSON-представление строки, а не JSON-представление объекта (dict), вы не можете заставить сервер возвращать вам другие данные; вам, вероятно, нужно сделать другой запрос. Если просто вы не знаете, как преобразовать представление JSON в эквивалентный объект Python, ответ Марджина Питерса верен.
abarnert

Ответы:


184

Если URL-адрес возвращает действительные данные в кодировке JSON, используйте jsonбиблиотеку для их декодирования:

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data

1
@ ManuelSchneid3r: Ответ здесь для Python 2, где чтение из responseдает вам строки байтов и json.load()ожидает чтения цепочки байтов. JSON должен быть закодирован с использованием кодека UTF, и вышеприведенное работает для UTF-8, UTF-16 и UTF-32, при условии, что кодовая точка спецификации включена для последних двух кодеков. Ответ, на который вы ссылаетесь, предполагает, что использовался UTF-8, что обычно правильно, потому что это значение по умолчанию. Начиная с Python 3.6, jsonбиблиотека автоматически декодирует байт-коды с данными JSON при условии, что используется кодировка UTF.
Martijn Pieters

@ ManuelSchneid3r: в противном случае я бы рекомендовал вам использовать requestsбиблиотеку, которая также автоматически определяет правильный кодек UTF для использования в тех случаях, когда спецификация отсутствует и в заголовке ответа не указан набор символов. Просто воспользуйтесь response.json()методом.
Martijn Pieters

35
import json
import urllib

url = 'http://example.com/file.json'
r = urllib.request.urlopen(url)
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
print(data)

urllib , для Python 3.4
HTTPMessage , возвращается r.info ()


1
Твердый код, отличный от print dataнеправильного для Python 3. Должен быть print(data).
Дэвид Меткалф

1
Да и строка 2 должна быть import urllib.request. Кроме того, этот файл .json в URL-адресе больше не существует.
hack-tramp

5
"""
Return JSON to webpage
Adding to wonderful answer by @Sanal
For Django 3.4
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo)
"""

import json
import urllib

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'
respons = urllib.request.urlopen(url)
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8'))
return HttpResponse(json.dumps(data), content_type="application/json")

1
Ух, этот json.dumps () спас мне день.
Lloyd

В случае Django 1.7 +, вы можете использовать JsonResponse непосредственно следующим from django.http import JsonResponse return JsonResponse({'key':'value'})
енот

1
Я делал json.dump () вместо json.dumps (), чувствуя себя тупым, спасибо за сохранение!
Hashir Baig

4

Будьте осторожны с проверкой и т. Д., Но прямое решение таково:

import json
the_dict = json.load(response)


1

Стандартная библиотека Python 3 однострочная:

load(urlopen(url))

# imports (place these above the code before running it)
from json import load
from urllib.request import urlopen
url = 'https://jsonplaceholder.typicode.com/todos/1'

0

Хотя я думаю, что он уже ответил, я хотел бы добавить немного в этом

import json
import urllib2
class Website(object):
    def __init__(self,name):
        self.name = name 
    def dump(self):
     self.data= urllib2.urlopen(self.name)
     return self.data

    def convJSON(self):
         data=  json.load(self.dump())
     print data

domain = Website("https://example.com")
domain.convJSON()

Примечание: объект, переданный в json.load (), должен поддерживать .read () , поэтому urllib2.urlopen (self.name) .read () не будет работать. Переданный Доамин должен быть предоставлен протоколом в этом случае http


0

вы также можете получить json, используя, requestsкак показано ниже:

import requests

r = requests.get('http://yoursite.com/your-json-pfile.json')
json_response = r.json()

0

Это еще одно более простое решение вашего вопроса

pd.read_json(data)

где данные - это вывод str из следующего кода

response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
json_data = response.read().decode('utf-8', 'replace')

-1

Ни один из приведенных здесь примеров не работал у меня. Они были либо для Python 2 (uurllib2), либо для Python 3, возвращали ошибку «ImportError: No module named request». Я гуглил сообщение об ошибке, и, по-видимому, мне нужно было установить модуль, что явно неприемлемо для такой простой задачи.

Этот код работал у меня:

import json,urllib
data = urllib.urlopen("https://api.github.com/users?since=0").read()
d = json.loads(data)
print (d)

2
Очевидно, вы используете Python 2. В Python 3 его нет urllib.urlopen; urlopenнаходится в urllib.requestмодуле.
Ник Маттео,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.