Любар, я видел твой пост в Stack Overflow, но собираюсь опубликовать аналогичный ответ здесь для согласованности. Это хороший вопрос. Я работаю в сфере проверки адресов и раньше решал ваши проблемы.
Я связался с этим вопросом переполнения стека в комментарии; и важно знать, что на самом деле нет никакой гарантии относительно формата полных уличных адресов произвольной формы. Как упомянуто в связанном посте, полные адреса могут выглядеть так:
1) Главная улица 102 Anytown, штат
2) 400n 600e # 2, 52173
3) ПО № 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Причины объяснены в связанном посте.) Я понимаю, что GeoPy возвращает адреса в определенном формате - в зависимости от используемого геокодера (какой результирующий формат находится вне контроля GeoPy), но адреса могут выглядеть всевозможными способами в пределах определенного компонент (например, с запятыми), и важно знать, что стандартизированные адреса не имеют запятых (согласно публикации USPS 28).
Я недавно помогал работать с API под названием LiveAddress ; он был обновлен для поддержки геокодирования и анализа однострочных адресов.
GeoPy разработан для геокодирования, а не для разбора на компоненты (эта задача на самом деле очень сложная по причинам, в которые я не буду здесь вдаваться). LiveAddress будет , однако, компонентизация адреса и вернуть координаты и другую информацию об адресе, и только если адреса реальны; никаких «угаданных» результатов.
Чтобы разобрать однострочный адрес в компонентах с помощью Python, просто поместите весь адрес в поле "улица":
import json
import pprint
import urllib
LOCATION = 'https://api.smartystreets.com/street-address/'
QUERY_STRING = urllib.urlencode({ # entire query sting must be URL-Encoded
'auth-token': r'YOUR_API_KEY_HERE',
'street': '1 infinite loop cupertino ca 95014'
})
URL = LOCATION + '?' + QUERY_STRING
response = urllib.urlopen(URL).read()
structure = json.loads(response)
pprint.pprint(structure)
Результирующий объект JSON будет содержать components
объект, который будет выглядеть примерно так:
"components": {
"primary_number": "1",
"street_name": "Infinite",
"street_suffix": "Loop",
"city_name": "Cupertino",
"state_abbreviation": "CA",
"zipcode": "95014",
"plus4_code": "2083",
"delivery_point": "01",
"delivery_point_check_digit": "7"
}
В ответ также будут включены сочетания first_line и delivery_line_2, поэтому вам не нужно вручную объединять их, если они вам нужны.