Python Программа для вызова API Google Maps, выдающая ошибку на urllib.urlencode - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь вызвать Google Map API с Python 3.8.

import urllib
import json

serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'

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

    url = serviceurl + urllib.urlencode({'sensor': 'false',
                                         'address': address})
    print('Retrieving', url)
    uh = urllib.urlopen(url)
    data = uh.read()
    print('Retrieved', len(data), 'characters')

    try:
        js = json.loads(str(data))
    except:
        js = None
    if 'status' not in js or js['status'] != 'OK':
        print('==== Failure To Retrieve ====')
        print(data)
        continue

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

    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)

Ошибка компиляции: urllib.urlencode и urllib.urlopen ..

И это

Невозможно найти ссылку 'urlencode' в 'init_.pyi «

1 Ответ

0 голосов
/ 26 января 2020

В вашем коде есть несколько проблем. Во-первых, urllib разделен на Python 3, пожалуйста, отметьте 'module' не имеет атрибута 'urlencode' .

Во-вторых, вам нужно использовать HTTPS протокол в запросе геокодирования, и убедитесь, что вы используете правильный ключ API:

serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?key=AIza****sYjs&'

В-третьих, замените json.loads(str(data)) просто json.loads(data).

Полный исправленный код ниже:

import urllib.parse
import urllib.request
import json

serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?key=AIza****sYjs&'

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

    url = serviceurl + urllib.parse.urlencode({'sensor': 'false',
                                               'address': address})
    print('Retrieving', url)
    uh = urllib.request.urlopen(url)
    data = uh.read()
    print('Retrieved', len(data), 'characters')
    try:
        js = json.loads(data)
    except:
        js = None
    if 'status' not in js or js['status'] != 'OK':
        print('==== Failure To Retrieve ====')
        print(data)
        continue

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

    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)

Вывод, например, для "paris, france":

Enter location: paris,france
Retrieving https://maps.googleapis.com/maps/api/geocode/json?key=AIza****sYjs&sensor=false&address=paris%2Cfrance
Retrieved 1690 characters
{
    "results": [
        {
            "address_components": [
                {
                    "long_name": "Paris",
                    "short_name": "Paris",
                    "types": [
                        "locality",
                        "political"
                    ]
                },
                {
                    "long_name": "Paris",
                    "short_name": "Paris",
                    "types": [
                        "administrative_area_level_2",
                        "political"
                    ]
                },
                {
                    "long_name": "\u00cele-de-France",
                    "short_name": "IDF",
                    "types": [
                        "administrative_area_level_1",
                        "political"
                    ]
                },
                {
                    "long_name": "France",
                    "short_name": "FR",
                    "types": [
                        "country",
                        "political"
                    ]
                }
            ],
            "formatted_address": "Paris, France",
            "geometry": {
                "bounds": {
                    "northeast": {
                        "lat": 48.9021449,
                        "lng": 2.4699208
                    },
                    "southwest": {
                        "lat": 48.815573,
                        "lng": 2.224199
                    }
                },
                "location": {
                    "lat": 48.856614,
                    "lng": 2.3522219
                },
                "location_type": "APPROXIMATE",
                "viewport": {
                    "northeast": {
                        "lat": 48.9021449,
                        "lng": 2.4699208
                    },
                    "southwest": {
                        "lat": 48.815573,
                        "lng": 2.224199
                    }
                }
            },
            "place_id": "ChIJD7fiBh9u5kcRYJSMaMOCCwQ",
            "types": [
                "locality",
                "political"
            ]
        }
    ],
    "status": "OK"
}
lat 48.856614 lng 2.3522219
Paris, France

Надеюсь, это поможет!

...