Как получить JSON с веб-страницы в скрипт Python

193

Получил следующий код в одном из моих скриптов:

#
# url is defined above.
#
jsonurl = urlopen(url)

#
# While trying to debug, I put this in:
#
print jsonurl

#
# Was hoping text would contain the actual json crap from the URL, but seems not...
#
text = json.loads(jsonurl)
print text

То, что я хочу сделать, это получить {{.....etc.....}}то, что я вижу по URL, когда я загружаю его в Firefox, в мой скрипт, чтобы я мог разобрать значение из него. Я погуглил тонну, но не нашел хорошего ответа о том, как на самом деле получить {{...}}материал из URL-адреса, заканчивающегося в .jsonобъект в скрипте Python.

Крис Б
источник

Ответы:

316

Получить данные из URL, а затем позвоните, json.loadsнапример,

Пример Python3 :

import urllib.request, json 
with urllib.request.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=google") as url:
    data = json.loads(url.read().decode())
    print(data)

Пример Python2 :

import urllib, json
url = "http://maps.googleapis.com/maps/api/geocode/json?address=google"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data

Результат будет выглядеть примерно так:

{
"results" : [
    {
    "address_components" : [
        {
            "long_name" : "Charleston and Huff",
            "short_name" : "Charleston and Huff",
            "types" : [ "establishment", "point_of_interest" ]
        },
        {
            "long_name" : "Mountain View",
            "short_name" : "Mountain View",
            "types" : [ "locality", "political" ]
        },
        {
...
Анураг Униал
источник
30
Вместо использования, json.loadsкоторое потребляет использование строки (именно поэтому .read()требуется, используйте json.load(response)вместо этого.
awatts
Только PSL, лаконично и эффективно
jlandercy
Является urllib2предпочтительным в python2?
Джон-Эрик
110

Я предполагаю, что вы действительно хотите получить данные из URL:

jsonurl = urlopen(url)
text = json.loads(jsonurl.read()) # <-- read from it

Или посмотрите декодер JSON в библиотеке запросов .

import requests
r = requests.get('someurl')
print r.json() # if response type was set to JSON, then you'll automatically have a JSON response here...
Джон Клементс
источник
заслуживает зеленый значок за этот вопрос! Спасибо!
Азиз Альто
27

Это получает словарь в формате JSON с веб-страницы с Python 2.X и Python 3.X:

#!/usr/bin/env python

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):
    """
    Receive the content of ``url``, parse it as JSON and return the object.

    Parameters
    ----------
    url : str

    Returns
    -------
    dict
    """
    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://maps.googleapis.com/maps/api/geocode/json?"
       "address=googleplex&sensor=false")
print(get_jsonparsed_data(url))

Смотрите также: Прочитайте и напишите пример для JSON

Мартин Тома
источник
24

Я обнаружил, что это самый простой и эффективный способ получить JSON с веб-страницы при использовании Python 3:

import json,urllib.request
data = urllib.request.urlopen("https://api.github.com/users?since=100").read()
output = json.loads(data)
print (output)
Аксбриджа
источник
4
Это не работает Вам нужно импортировать urlopen из urllib.request, то естьfrom urllib.request import urlopen
Дэвид Ласзук
5

Все, что urlopen()делает вызов (в соответствии с документами ), возвращает объект, похожий на файл. Когда у вас есть это, вам нужно вызвать его read()метод, чтобы фактически передать данные JSON по сети.

Что-то вроде:

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text
bgporter
источник
5

В Python 2 json.load () будет работать вместо json.loads ()

import json
import urllib

url = 'https://api.github.com/users?since=100'
output = json.load(urllib.urlopen(url))
print(output)

К сожалению, это не работает в Python 3. json.load - это просто оболочка вокруг json.loads, которая вызывает read () для файлового объекта. Для json.loads требуется строковый объект, а вывод urllib.urlopen (url) .read () является байтовым объектом. Поэтому нужно получить кодировку файла, чтобы он работал в Python 3.

В этом примере мы запрашиваем заголовки для кодировки и возвращаемся к utf-8, если мы не получаем его. Объект заголовков отличается между Python 2 и 3, поэтому это должно быть сделано разными способами. Использование запросов позволит избежать всего этого, но иногда вам нужно придерживаться стандартной библиотеки.

import json
from six.moves.urllib.request import urlopen

DEFAULT_ENCODING = 'utf-8'
url = 'https://api.github.com/users?since=100'
urlResponse = urlopen(url)

if hasattr(urlResponse.headers, 'get_content_charset'):
    encoding = urlResponse.headers.get_content_charset(DEFAULT_ENCODING)
else:
    encoding = urlResponse.headers.getparam('charset') or DEFAULT_ENCODING

output = json.loads(urlResponse.read().decode(encoding))
print(output)
авизо
источник
Я знаю, что шестерка тоже не входит в стандартную библиотеку, но она показана здесь для удобства. Без этого вам понадобится блок if / else или try / exception, чтобы определить, где получить urlopen ().
Авизо
3

Нет необходимости использовать дополнительную библиотеку для разбора json ...

json.loads()возвращает словарь .

Так что в вашем случае просто сделайте text["someValueKey"]

Posit Labs
источник
3

Поздний ответ, но для python>=3.6вас можно использовать:

import dload
j = dload.json(url)

Установить dloadс помощью:

pip3 install dload
CONvid19
источник
0

вам нужно import requestsи использовать из метода json ():

source = requests.get("url").json()
print(source)

Конечно, этот метод также работает:

import json,urllib.request
data = urllib.request.urlopen("url").read()
output = json.loads(data)
print (output)
mamal
источник
-1

Вы можете использовать json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

для загрузки json и записи его в файл полезен следующий код:

data = json.loads(json.dumps(Response, sort_keys=False, indent=4))
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=False, indent=4)
Keivan
источник