L oop через несколько параметров API - PullRequest
0 голосов
/ 07 марта 2020

У меня есть документация по API веб-сайта http://json-homework.task-sss.krasilnikov.spb.ru/docs/9f66a575a6cfaaf7e43177317461d057, и я должен найти всех пользователей, которые учились в школах в определенном городе (идентификатор которых равен 2). Запустив этот код (all_users - это список с основной информацией о пользователях из предыдущей задачи):

school=[]
for user in all_users:
        user_id=user.get('id') 
        url = f'http://json-homework.task-sss.krasilnikov.spb.ru/api/user/get?api_key=9f66a575a6cfaaf7e43177317461d057&user_id={user_id}&fields=schools'
        data = rq.get(url)
        school=school+json.loads(data.text)["response"]
school

Я получаю такие данные (вот небольшая часть вывода с множеством заполненных полей ):

 {'id': 136840302,
  'first_name': 'Marina',
  'last_name': 'Kushnir',
  'is_closed': False,
  'schools': [{'id': '352496',
    'country': 1,
    'city': 57,
    'name': 'Лицей ИГУ',
    'year_from': 2015,
    'year_to': 2019,
    'class': '',
    'type': 2,
    'type_str': 'Lyceum'}]},

Итак, у меня есть параметр 'city', заключенный в параметр 'schools', и мне нужно извлечь только тех пользователей, у которых этот параметр 'city': 2. Я также попробовал этот код:

school=[]
for user in all_users:
    user_id=user.get('id') 
    url = f'http://json-homework.task-sss.krasilnikov.spb.ru/api/user/get?api_key=9f66a575a6cfaaf7e43177317461d057&user_id={user_id}&fields=schools'
    data = rq.get(url)
    school=school+json.loads(data.text)["response"]
school_norm=json_normalize(school)
schools = school_norm.get('schools')
school2=[]
for i in schools:
        if "'city' : 2" in i:
            school2.append(json.loads(data.text)["response"])
sch=pd.DataFrame(school2)

, но он не принимает такое условие if "'city' : 2" in i:. Итак, как я могу выполнить эту задачу?

Мой код из первой задачи:

all_users = []
for page in range(1,42):
    url=f'http://json-homework.task-sss.krasilnikov.spb.ru/api/groups/getmembers?api_key=9f66a575a6cfaaf7e43177317461d057&group_id=4508123&page={page}'
    data=rq.get(url)
    all_users = all_users + json.loads(data.text)["response"]
json_normalize(all_users)
group_data = pd.DataFrame(all_users, columns=['id','first_name','last_name']) 
group_data = group_data.sort_values('id')
group_data = group_data.set_index('id')
group_data 

и вывод: DataFrame Итак, в выводе моей вышеописанной задачи Мне нужно получить похожий на этот фрейм данных, но только с теми людьми, у которых id школьного города = 2, как я объяснял ранее

1 Ответ

1 голос
/ 07 марта 2020

Следующее немного запутано, но оно должно привести вас, по крайней мере, достаточно близко к тому месту, куда вы хотите go. Обратите внимание, что предполагается, что ваши данные имеют допустимый формат json (в вашем вопросе это не так; вам придется разбираться с этим отдельно - , посмотрите этот вариант, чтобы исправить неверно сформированный json.

Во всяком случае, учитывая это, я лично считаю, что лучший способ справиться с этим типом вопроса - использовать jsonpath для python. Итак, вот так:

Давайте предположим, что ваши данные состоят из двух ( допустимый json) один из которых удовлетворяет условию, что идентификатор города равен 2, а другой нет:

schls ="""
[
  {
    "id": 136840302,
    "first_name": "Marina",
    "last_name": "Kushnir",
    "is_closed": "False,",
    "schools": [
      {
        "id": "352496",
        "country": 1,
        "city": 57,
        "name": "Лицей ИГУ",
        "year_from": 2015,
        "year_to": 2019,
        "class": "",
        "type": 2,
        "type_str": "Lyceum"
      }
    ]
  },
  {
    "id": 5555555555555,
    "first_name": "Marino",
    "last_name": "Kush",
    "is_closed": "False,",
    "schools": [
      {
        "id": "355556",
        "country": 1,
        "city": 2,
        "name": "Лице ИГ",
        "year_from": 2016,
        "year_to": 2018,
        "class": "",
        "type": 4,
        "type_str": "Lyceu"
      }
    ]
  }
]
"""

Давайте обработаем данные:

import pandas as pd
import json
from jsonpath_ng import jsonpath, parse

data = json.loads(schls)
jsn_search = parse('$..schools') #this is your search string; looking for info in the "schools" entry
match = jsn_search.find(data) #search for the search string in the loaded json
schools = []
for m in match:
    if m.context.value.get('schools')[0].get('city')== 2: #this is your condition!
        schools.append(m.context.value) #condition met; append all surrounding info to list
df=pd.DataFrame(schools)
sch = df.drop(['is_closed' , 'schools'] , axis='columns')
sch

Вывод:

        id      first_name  last_name
0   5555555555555   Marino  Kush
...