Получение названия улицы из json ответа api яндекс геокодер

Отправляю в геокодер набор адресов Москвы и Московской области для получения улицы, координат объекта и потом, района. Ответ выглядит так:

  {'response': {'GeoObjectCollection': {'metaDataProperty': {'GeocoderResponseMetaData': {'request': 'город Москва, улица Егора Абакумова, дом 9',
       'results': '10',
       'found': '1'}},
     'featureMember': [{'GeoObject': {'metaDataProperty': {'GeocoderMetaData': {'precision': 'exact',
          'text': 'Россия, Москва, улица Егора Абакумова, 9',
          'kind': 'house',
          'Address': {'country_code': 'RU',
           'formatted': 'Россия, Москва, улица Егора Абакумова, 9',
           'postal_code': '129347',
           'Components': [{'kind': 'country', 'name': 'Россия'},
            {'kind': 'province', 'name': 'Центральный федеральный округ'},
            {'kind': 'province', 'name': 'Москва'},
            {'kind': 'locality', 'name': 'Москва'},
            {'kind': 'street', 'name': 'улица Егора Абакумова'},
            {'kind': 'house', 'name': '9'}]},
          'AddressDetails': {'Country': {'AddressLine': 'Россия, Москва, улица Егора Абакумова, 9',
            'CountryNameCode': 'RU',
            'CountryName': 'Россия',
            'AdministrativeArea': {'AdministrativeAreaName': 'Москва',
             'Locality': {'LocalityName': 'Москва',
              'Thoroughfare': {'ThoroughfareName': 'улица Егора Абакумова',
               'Premise': {'PremiseNumber': '9',
                'PostalCode': {'PostalCodeNumber': '129347'}}}}}}}}},
        'name': 'улица Егора Абакумова, 9',
        'description': 'Москва, Россия',
        'boundedBy': {'Envelope': {'lowerCorner': '37.710368 55.876698',
          'upperCorner': '37.718579 55.881313'}},
        'Point': {'pos': '37.714474 55.879005'}}}]}}}

В случае с Москвой получаю улицы таким запросом: response['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['metaDataProperty']['GeocoderMetaData']['AddressDetails']['Country']['AdministrativeArea']['Locality']['Thoroughfare']['ThoroughfareName'] , но если в адресе больше полей, и это город в МО, то ответ выглядит так:

  {'response': {'GeoObjectCollection': {'metaDataProperty': {'GeocoderResponseMetaData': {'request': 'город Москва, город Щербинка, Варшавское шоссе, 28-й километр, владение 8, строение 1',
       'results': '10',
       'found': '1'}},
     'featureMember': [{'GeoObject': {'metaDataProperty': {'GeocoderMetaData': {'precision': 'number',
          'text': 'Россия, Москва, Щербинка, Варшавское шоссе, 28-й километр, 8А',
          'kind': 'house',
          'Address': {'country_code': 'RU',
           'formatted': 'Россия, Москва, Щербинка, Варшавское шоссе, 28-й километр, 8А',
           'Components': [{'kind': 'country', 'name': 'Россия'},
            {'kind': 'province', 'name': 'Центральный федеральный округ'},
            {'kind': 'province', 'name': 'Москва'},
            {'kind': 'area', 'name': 'Новомосковский административный округ'},
            {'kind': 'area', 'name': 'поселение Щербинка'},
            {'kind': 'locality', 'name': 'Щербинка'},
            {'kind': 'street', 'name': 'Варшавское шоссе, 28-й километр'},
            {'kind': 'house', 'name': '8А'}]},
          'AddressDetails': {'Country': {'AddressLine': 'Россия, Москва, Щербинка, Варшавское шоссе, 28-й километр, 8А',
            'CountryNameCode': 'RU',
            'CountryName': 'Россия',
            'AdministrativeArea': {'AdministrativeAreaName': 'Москва',
             'SubAdministrativeArea': {'SubAdministrativeAreaName': 'Новомосковский административный округ',
              'Locality': {'LocalityName': 'Щербинка',
               'Thoroughfare': {'ThoroughfareName': 'Варшавское шоссе, 28-й километр',
                'Premise': {'PremiseNumber': '8А'}}}}}}}}},
        'name': 'Варшавское шоссе, 28-й километр, 8А',
        'description': 'Щербинка, Москва, Россия',
        'boundedBy': {'Envelope': {'lowerCorner': '37.570797 55.508473',
          'upperCorner': '37.579008 55.513132'}},
        'Point': {'pos': '37.574902 55.510803'}}}]}}}

и улицу получается в этом случае выделить только так:

  response['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']['Components'][6]

а хочется выделить ее по названию тэга 'kind': 'street', 'name', чтобы в итоге получить только название улицы в любом типе населенного пункта.


Ответы (2 шт):

Автор решения: Aziz Umarov

Конечно не понятно почему Вам не устраивает тот же вариант что и в первом случае но все же можно попробовать так, чтоб без 6ки в индексе

 response['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']['Components'].filter(item => item.kind === 'street')[0]['name']

введите сюда описание изображения

→ Ссылка
Автор решения: ykoavlil

Сохранил себе оба json файла на ПК, открываю их и получаю нужные поля.

Ниже несколько способов получить адрес в разных форматах которые я заметил (что-то мог упустить).

import json
from pathlib import Path

experiments = Path.home() / 'experiments'

with open(experiments / 'response_1.json') as file:
    response = json.loads(file.read())['response']['GeoObjectCollection']
    print(response['metaDataProperty']['GeocoderResponseMetaData']['request'])
    # город Москва, улица Егора Абакумова, дом 9
    # город Москва, город Щербинка, Варшавское шоссе, 28-й километр, владение 8, строение 1
    
    print(response['featureMember'][0]['GeoObject']['name'])
    # улица Егора Абакумова, 9
    # Варшавское шоссе, 28-й километр, 8А
    
    print(response['featureMember'][0]['GeoObject']['metaDataProperty']
                  ['GeocoderMetaData']['text'])
    # Россия, Москва, улица Егора Абакумова, 9
    # Россия, Москва, Щербинка, Варшавское шоссе, 28-й километр, 8А
    
    print(response['featureMember'][0]['GeoObject']['metaDataProperty']
                  ['GeocoderMetaData']['AddressDetails']
                  ['Country']['AddressLine'])
    # Россия, Москва, улица Егора Абакумова, 9
    # Россия, Москва, Щербинка, Варшавское шоссе, 28-й километр, 8А

Как уже предложили выше, для удобства можно запустить Google Chrome, нажать F12 и выбрать Console куда написать

var test = { Вставить полный json}

После чего перемещаться по дереву и сделать "Copy property path" для нужного поля, это даст полный путь к нему.

→ Ссылка