Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 18, 2019 16:31:10

Goldberg
Зарегистрирован: 2019-01-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

Я новичок в питоне и хотел бы разобраться с проблемой парсинга json ответа, может быть кто-то подскажет мне другое решение.

Вот мой код

 import requests
import json
######################## URL Endpoints ########################
url_sandbox = 'https://sandbox-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'
############# Authentication ont the web-server ###############
auth_sandbox	= {
	'sort': 'market_cap',
	'start': '1',
	'limit': '3',
	'cryptocurrency_type': 'all',
	'convert': 'USD',
	'CMC_PRO_API_KEY': 'XXXXX-YYYY-4492-PPPP-ZSDSIQWEUD'
} # dict to authenticate on a test environment
######### Getting top 100 Crypto from the Coinmarket ############
auth = requests.get(url_sandbox, params=auth_sandbox)
cryptocurrency_list = json.loads(auth.content)
print(cryptocurrency_list)
print(type(cryptocurrency_list))

От сервера получаю json ответ
 {
    "status": {
        "timestamp": "2019-01-18T14:15:23.429Z",
        "error_code": 0,
        "error_message": null,
        "elapsed": 6,
        "credit_count": 1
    },
    "data": [
        {
            "id": 1,
            "name": "Bitcoin",
            "symbol": "BTC",
            "slug": "bitcoin",
            "circulating_supply": 17435912,
            "total_supply": 17435912,
            "max_supply": 21000000,
            "date_added": "2013-04-28T00:00:00.000Z",
            "num_market_pairs": 6695,
            "tags": [
                "mineable"
            ],
            "platform": null,
            "cmc_rank": 1,
            "last_updated": "2018-12-22T06:08:23.000Z",
            "quote": {
                "USD": {
                    "price": 3881.88864625,
                    "volume_24h": 6341959230.33247,
                    "percent_change_1h": 0.426252,
                    "percent_change_24h": -4.10839,
                    "percent_change_7d": 19.472,
                    "market_cap": 67684268829.81413,
                    "last_updated": "2018-12-22T06:08:23.000Z"
                }
            }
        },
        {
            "id": 52,
            "name": "XRP",
            "symbol": "XRP",
            "slug": "ripple",
            "circulating_supply": 40794121066,
            "total_supply": 99991738974,
            "max_supply": 100000000000,
            "date_added": "2013-08-04T00:00:00.000Z",
            "num_market_pairs": 307,
            "tags": [],
            "platform": null,
            "cmc_rank": 2,
            "last_updated": "2018-12-22T06:08:03.000Z",
            "quote": {
                "USD": {
                    "price": 0.353610065729,
                    "volume_24h": 617573458.768739,
                    "percent_change_1h": 0.712268,
                    "percent_change_24h": -3.66051,
                    "percent_change_7d": 22.3608,
                    "market_cap": 14425211831.505043,
                    "last_updated": "2018-12-22T06:08:03.000Z"
                }
            }
        },
        {
            "id": 1027,
            "name": "Ethereum",
            "symbol": "ETH",
            "slug": "ethereum",
            "circulating_supply": 103938514.4366,
            "total_supply": 103938514.4366,
            "max_supply": null,
            "date_added": "2015-08-07T00:00:00.000Z",
            "num_market_pairs": 4792,
            "tags": [
                "mineable"
            ],
            "platform": null,
            "cmc_rank": 3,
            "last_updated": "2018-12-22T06:08:17.000Z",
            "quote": {
                "USD": {
                    "price": 108.4856134,
                    "volume_24h": 2315879861.38542,
                    "percent_change_1h": 0.540547,
                    "percent_change_24h": -4.84225,
                    "percent_change_7d": 28.202,
                    "market_cap": 11275833494.539307,
                    "last_updated": "2018-12-22T06:08:17.000Z"
                }
            }
        }
    ]
}

потом я его преобразую в словарь

 {u'status': {u'credit_count': 1, u'timestamp': u'2019-01-18T14:17:39.133Z', u'error_message': None, u'error_code': 0, u'elapsed': 7}, u'data': [{u'last_updated': u'2018-12-22T06:08:23.000Z', u'platform': None, u'name': u'Bitcoin', u'tags': [u'mineable'], u'quote': {u'USD': {u'market_cap': 67684268829.81413, u'last_updated': u'2018-12-22T06:08:23.000Z', u'percent_change_7d': 19.472, u'price': 3881.88864625, u'percent_change_24h': -4.10839, u'volume_24h': 6341959230.33247, u'percent_change_1h': 0.426252}}, u'symbol': u'BTC', u'slug': u'bitcoin', u'total_supply': 17435912, u'num_market_pairs': 6695, u'max_supply': 21000000, u'circulating_supply': 17435912, u'cmc_rank': 1, u'date_added': u'2013-04-28T00:00:00.000Z', u'id': 1}, {u'last_updated': u'2018-12-22T06:08:03.000Z', u'platform': None, u'name': u'XRP', u'tags': [], u'quote': {u'USD': {u'market_cap': 14425211831.505043, u'last_updated': u'2018-12-22T06:08:03.000Z', u'percent_change_7d': 22.3608, u'price': 0.353610065729, u'percent_change_24h': -3.66051, u'volume_24h': 617573458.768739, u'percent_change_1h': 0.712268}}, u'symbol': u'XRP', u'slug': u'ripple', u'total_supply': 99991738974, u'num_market_pairs': 307, u'max_supply': 100000000000, u'circulating_supply': 40794121066, u'cmc_rank': 2, u'date_added': u'2013-08-04T00:00:00.000Z', u'id': 52}, {u'last_updated': u'2018-12-22T06:08:17.000Z', u'platform': None, u'name': u'Ethereum', u'tags': [u'mineable'], u'quote': {u'USD': {u'market_cap': 11275833494.539307, u'last_updated': u'2018-12-22T06:08:17.000Z', u'percent_change_7d': 28.202, u'price': 108.4856134, u'percent_change_24h': -4.84225, u'volume_24h': 2315879861.38542, u'percent_change_1h': 0.540547}}, u'symbol': u'ETH', u'slug': u'ethereum', u'total_supply': 103938514.4366, u'num_market_pairs': 4792, u'max_supply': None, u'circulating_supply': 103938514.4366, u'cmc_rank': 3, u'date_added': u'2015-08-07T00:00:00.000Z', u'id': 1027}]}
<type 'dict'>

Хочу из этого всего обращаться к каждой “секции” и получать либо полный ответ конкретной секции или определенные элементы секции.

Например, как мне из этого всего получить все значения именно по “Ethereum”?

Пытался работать со словарем и получать значения по ключу, но дело в том, что ключ у нас “data”, а все значения это вот как раз эти самые разные секции и как обратиться к одной секции не знаю.
Работать со строкой и перебирать каждый символ не очень удобно, потому как ответ от сервера может поменяться. Мне нужен какой-то “секционный” подход.

Отредактировано Goldberg (Янв. 18, 2019 16:48:02)

Офлайн

#2 Янв. 18, 2019 18:07:41

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

Офлайн

#3 Янв. 18, 2019 19:40:00

Goldberg
Зарегистрирован: 2019-01-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

Вопрос решился благодаря добрым людям телеграм канала.
В общем не нужно было изобретать велосипед.
Проблемы по сути и не было, каждая секция рассматривается как один элемент массива и можно было бы обратиться по индексу,

 print(cryptocurrency_list['data'][1])

но т.к. данные могут меняться, то лучше просто использовать перебор в словаре data
 for crypt in cryptocurrency_list['data']:
  if crypt['name'] == 'XRP':
  	print crypt.get('num_market_pairs')

Офлайн

#4 Янв. 18, 2019 20:18:28

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

можно и так, если надо понять где что в json я пользую допиленный вариант

 def flatten2(obj):
    out = []
    def flatten(obj,keys='[',delim='][',):
        if type(obj) is dict and obj:
            for key in obj:
                flatten(obj[key], keys + repr(key) + delim)
        elif type(obj) is list and obj:
            for  i,item in enumerate(obj):
                flatten(item, keys + repr(i) + delim)
        else:
            out.append([keys[:-1],obj])
    flatten(obj)
    return out
 
f = flatten2(d)
for k,v in f :
    print(k,'=>',v)
для вашего случая будет
 ['status']['timestamp'] => 2019-01-18T14:15:23.429Z
['status']['error_code'] => 0
['status']['error_message'] => None
['status']['elapsed'] => 6
['status']['credit_count'] => 1
['data'][0]['id'] => 1
['data'][0]['name'] => Bitcoin
['data'][0]['symbol'] => BTC
['data'][0]['slug'] => bitcoin
['data'][0]['circulating_supply'] => 17435912
['data'][0]['total_supply'] => 17435912
['data'][0]['max_supply'] => 21000000
['data'][0]['date_added'] => 2013-04-28T00:00:00.000Z
['data'][0]['num_market_pairs'] => 6695
['data'][0]['tags'][0] => mineable
['data'][0]['platform'] => None
['data'][0]['cmc_rank'] => 1
['data'][0]['last_updated'] => 2018-12-22T06:08:23.000Z
['data'][0]['quote']['USD']['price'] => 3881.88864625
['data'][0]['quote']['USD']['volume_24h'] => 6341959230.33247
['data'][0]['quote']['USD']['percent_change_1h'] => 0.426252
['data'][0]['quote']['USD']['percent_change_24h'] => -4.10839
['data'][0]['quote']['USD']['percent_change_7d'] => 19.472
['data'][0]['quote']['USD']['market_cap'] => 67684268829.81413
['data'][0]['quote']['USD']['last_updated'] => 2018-12-22T06:08:23.000Z
['data'][1]['id'] => 52
['data'][1]['name'] => XRP
['data'][1]['symbol'] => XRP
['data'][1]['slug'] => ripple
['data'][1]['circulating_supply'] => 40794121066
['data'][1]['total_supply'] => 99991738974
['data'][1]['max_supply'] => 100000000000
['data'][1]['date_added'] => 2013-08-04T00:00:00.000Z
['data'][1]['num_market_pairs'] => 307
['data'][1]['tags'] => []
['data'][1]['platform'] => None
['data'][1]['cmc_rank'] => 2
['data'][1]['last_updated'] => 2018-12-22T06:08:03.000Z
['data'][1]['quote']['USD']['price'] => 0.353610065729
['data'][1]['quote']['USD']['volume_24h'] => 617573458.768739
['data'][1]['quote']['USD']['percent_change_1h'] => 0.712268
['data'][1]['quote']['USD']['percent_change_24h'] => -3.66051
['data'][1]['quote']['USD']['percent_change_7d'] => 22.3608
['data'][1]['quote']['USD']['market_cap'] => 14425211831.505043
['data'][1]['quote']['USD']['last_updated'] => 2018-12-22T06:08:03.000Z
['data'][2]['id'] => 1027
['data'][2]['name'] => Ethereum
['data'][2]['symbol'] => ETH
['data'][2]['slug'] => ethereum
['data'][2]['circulating_supply'] => 103938514.4366
['data'][2]['total_supply'] => 103938514.4366
['data'][2]['max_supply'] => None
['data'][2]['date_added'] => 2015-08-07T00:00:00.000Z
['data'][2]['num_market_pairs'] => 4792
['data'][2]['tags'][0] => mineable
['data'][2]['platform'] => None
['data'][2]['cmc_rank'] => 3
['data'][2]['last_updated'] => 2018-12-22T06:08:17.000Z
['data'][2]['quote']['USD']['price'] => 108.4856134
['data'][2]['quote']['USD']['volume_24h'] => 2315879861.38542
['data'][2]['quote']['USD']['percent_change_1h'] => 0.540547
['data'][2]['quote']['USD']['percent_change_24h'] => -4.84225
['data'][2]['quote']['USD']['percent_change_7d'] => 28.202
['data'][2]['quote']['USD']['market_cap'] => 11275833494.539307
['data'][2]['quote']['USD']['last_updated'] => 2018-12-22T06:08:17.000Z
получаются все цепочки ключ - значения

Отредактировано vic57 (Янв. 18, 2019 20:23:32)

Офлайн

#5 Янв. 19, 2019 15:57:57

Goldberg
Зарегистрирован: 2019-01-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

vic57
можно и так, если надо понять где что в json я пользую допиленный вариант

меня вот только один момент смутил, что я не могу получить отсюда
 for crypt in cryptocurrency_list['data']:
  if crypt['name'] == 'XRP':
  	print crypt.get('num_market_pairs')
не целое значение.
Eсли я обращаюсь к “price”, то я получаю none

Офлайн

#6 Янв. 19, 2019 16:32:31

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

None - значит такого ключа нет

 f = flatten2(d['data'])
for k,v in f :
    if 'name' in k or 'price' in k: print(k,'=>',v)
 [0]['name'] => Bitcoin
[0]['quote']['USD']['price'] => 3881.88864625
[1]['name'] => XRP
[1]['quote']['USD']['price'] => 0.353610065729
[2]['name'] => Ethereum
[2]['quote']['USD']['price'] => 108.4856134

Офлайн

#7 Янв. 19, 2019 16:35:26

Goldberg
Зарегистрирован: 2019-01-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с парсингом Json

vic57
None - значит такого ключа нет
точно, какой я невнимательный, я не правильно задал путь к ключу

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version