Извлечь двухсимвольный код страны из полученных данных в Python - PullRequest
0 голосов
/ 17 июня 2020

Я изучаю Python на coursera, и это дополнительное упражнение в книге, которое я решаю для практики.

Измените www.py4e.com/code3/geojson.py или www.py4e.com/code3/geoxml.py, чтобы распечатать двухсимвольный код страны из полученных данных. Добавьте проверку ошибок, чтобы ваша программа не отслеживала, если код страны отсутствует. После того, как он заработает, найдите «Atlanti c Ocean» и убедитесь, что он может обрабатывать местоположения, которые не находятся в какой-либо стране.

Ниже приведен код, который я написал, но я не понимаю, что следует Я делаю следующее, и я не понял точных требований этого вопроса и мне интересно, как будет выглядеть результат? Каким должно быть исполнение образца? А что мне попробовать ввести код, страну, округ или название университета? Приветствуется любая помощь и идеи!

import urllib.request, urllib.parse, urllib.error
import json
import ssl

api_key = False
# If you have a Google Places API key, enter it here
# api_key = 'AIzaSy___IDByT70'
# https://developers.google.com/maps/documentation/geocoding/intro

if api_key is False:
    api_key = 42
    serviceurl = 'http://py4e-data.dr-chuck.net/json?'
else :
    serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?'

# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

while True:
    address = input('Enter location: ')
    if len(address) < 1: break

    parms = dict()
    parms['address'] = address
    if api_key is not False: parms['key'] = api_key
    url = serviceurl + urllib.parse.urlencode(parms)

    print('Retrieving', url)
    uh = urllib.request.urlopen(url, context=ctx)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')

    try:
        js = json.loads(data)
    except:
        js = None

    if not js or 'status' not in js or js['status'] != 'OK':
        print('==== Failure To Retrieve ====')
        print(data)
        continue

    print(json.dumps(js, indent=4))

В любом случае я получаю следующую ошибку для того, что я ввожу: Enter location: Drexel Retrieving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=Drexel Retrieved 237 characters ==== Failure To Retrieve ==== b'{\n "error_message" : "You must use an API key to authenticate each request to Google Maps Platform APIs. For additional information, please refer to http://g.co/dev/maps-no-account",\n "results" : [],\n "status" : "REQUEST_DENIED"\n}\n' Enter location:

1 Ответ

2 голосов
/ 31 августа 2020

Я отвечу на это как две части.

Часть 1: чтобы избежать вышеуказанной ошибки.

Конечно, вы можете использовать ключ API Google Places, но так как он предназначен для образовательных целей (Альтернатива есть в самом курсе, http://py4e-data.dr-chuck.net)

Вышеупомянутая ошибка возникает из-за неправильного ключа API. (Этот код отлично работает в моей системе.) Тем не менее, если вы столкнулись с той же проблемой, удалите следующий блок кода

api_key = False
if api_key is False:
    api_key = 42
    serviceurl = 'http://py4e-data.dr-chuck.net/json?'
else :
    serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?'

и замените только следующими двумя строками

api_key = 42
serviceurl = 'http://py4e-data.dr-chuck.net/json?'

Таким образом, здесь будут использоваться только данные с этого веб-сайта (не из API Google Place).

Часть 2:

Для этого сначала проверьте, была ли это страна или нет. Затем выведите «краткое_имя» страны в «адрес_компонент». Найдите код ниже

import urllib.request, urllib.parse, urllib.error
import json
import ssl

api_key = False
if api_key is False:
    api_key = 42
    serviceurl = 'http://py4e-data.dr-chuck.net/json?'
else :
    serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?'

# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

while True:
    address = input('Enter location: ')
    if len(address) < 1: break
    parms = dict()
    parms['address'] = address
    if api_key is not False: parms['key'] = api_key
    url = serviceurl + urllib.parse.urlencode(parms)
    print('Retrieving', url)
    uh = urllib.request.urlopen(url, context=ctx)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')
    try:
        js = json.loads(data)
    except:
        js = None
    if not js or 'status' not in js or js['status'] != 'OK':
        print('==== Failure To Retrieve ====')
        print(data)
        continue
    lat = js['results'][0]['geometry']['location']['lat']
    lng = js['results'][0]['geometry']['location']['lng']
    # print('lat', lat, 'lng', lng)
    location = js['results'][0]['formatted_address']
    # print(location)
    results = js['results'][0]
    address_components = results["address_components"]
    is_a_country = False
    try:
        for elem in address_components:
            types = elem["types"]
            if types == ["country", "political"]:
                is_a_country = True
                print("The two-character country code from the retrieved data is:", elem["short_name"])
        if not is_a_country:
            raise Exception
    except:
        print("There is no country code for that location.")

Для более наглядного понимания go по адресу, напечатанному этим кодом. Вы можете увидеть объект json текущего запроса. Ниже приведен образец Объект JSON места УРУВАХАЛ, ИНДИЯ

Просто выведите значение short_name для этого конкретного типа для вашего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...