Lubar, vi tu publicación en Stack Overflow pero voy a publicar una respuesta similar aquí por coherencia. Es una buena pregunta Trabajo en la industria de verificación de direcciones y he abordado su tipo de problema anteriormente.
Me vinculé a esta pregunta de desbordamiento de pila en un comentario; y es importante saber que realmente no hay garantía sobre el formato de las direcciones completas de forma libre. Como se menciona en la publicación vinculada, las direcciones completas pueden verse como cualquiera de estas:
1) 102 main street Anytown, estado
2) 400n 600e # 2, 52173
3) po # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Las razones se explican en la publicación vinculada). Me doy cuenta de que GeoPy devuelve direcciones en un formato determinado, dependiendo del geocodificador utilizado (cuyo formato resultante está fuera del control de GeoPy), pero las direcciones pueden verse de muchas maneras dentro de un determinado componente (como tener comas), y es importante saber que las direcciones estandarizadas no tienen comas (de acuerdo con la publicación 28 de USPS).
Recientemente ayudé a trabajar en una API llamada LiveAddress ; se acaba de actualizar para admitir geocodificación y análisis de direcciones de una sola línea.
GeoPy está diseñado para geocodificar, no analizar en componentes (esa tarea es realmente difícil por razones por las que no entraré aquí). LiveAddress será , sin embargo, componentizar la dirección y las coordenadas y otra información pertinente acerca de la dirección, y sólo si las direcciones son reales; sin resultados "adivinados".
Para analizar una dirección de una sola línea en componentes usando Python, simplemente ponga la dirección completa en el campo "calle":
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)
El objeto JSON resultante contendrá un components
objeto que se verá así:
"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"
}
La respuesta también incluirá first_line y delivery_line_2 combinados para que no tenga que concatenarlos manualmente si los necesita.