Любаре, я бачив вашу публікацію в 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 Publication 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, тому вам не доведеться об'єднувати їх вручну, якщо вони вам потрібні.