Lubar, widziałem twój post na Stack Overflow, ale zamierzam opublikować podobną odpowiedź tutaj w celu zachowania spójności. To dobre pytanie. Pracuję w branży weryfikacji adresów i już wcześniej rozwiązałem Twój problem.
W komentarzu powiązałem to pytanie dotyczące przepełnienia stosu ; i ważne jest, aby wiedzieć, że tak naprawdę nie ma gwarancji co do formatu pełnych dowolnych adresów ulic. Jak wspomniano w łączonym poście, kompletne adresy mogą wyglądać następująco:
1) 102 główna ulica Anytown, stan
2) 400n 600e # 2, 52173
3) po # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Powody są wyjaśnione w łączonym poście.) Zdaję sobie sprawę, że GeoPy zwraca adresy w określonym formacie - w zależności od użytego geokodera (którego wynikowy format jest poza kontrolą GeoPy), ale adresy mogą wyglądać na różne sposoby w określonym składnik (na przykład przecinki) i ważne jest, aby wiedzieć, że w standardowych adresach nie ma przecinków (zgodnie z publikacją USPS 28).
Pomogłem niedawno pracować nad interfejsem API o nazwie LiveAddress ; właśnie został zaktualizowany do obsługi geokodowania i parsowania adresu w jednym wierszu.
GeoPy jest zaprojektowany do geokodowania, a nie parsowania na komponenty (to zadanie jest naprawdę bardzo trudne z powodów, dla których nie będę tu wchodził). LiveAddress będzie jednak składać adres i zwracać współrzędne oraz inne informacje o adresie i tylko wtedy, gdy adresy będą prawdziwe; brak „odgadniętych” wyników.
Aby parsować adres jednowierszowy w komponenty za pomocą Pythona, po prostu umieść cały adres w polu „street”:
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)
Wynikowy obiekt JSON będzie zawierał components
obiekt, który będzie wyglądał mniej więcej tak:
"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"
}
Odpowiedź będzie również zawierać kombinację first_line i delivery_line_2, więc nie musisz ręcznie łączyć tych, jeśli ich potrzebujesz.