Lubar, j'ai vu votre message sur Stack Overflow mais je vais poster une réponse similaire ici pour plus de cohérence. C'est une bonne question. Je travaille dans l'industrie de la vérification d'adresse et j'ai déjà abordé votre type de problème.
J'ai lié à cette question Stack Overflow dans un commentaire; et il est important de savoir qu'il n'y a vraiment aucune garantie quant au format des adresses de rue de forme libre complètes. Comme mentionné dans le post lié, les adresses complètes peuvent ressembler à n'importe laquelle de ces:
1) 102 rue principale Anytown, état
2) 400n 600e # 2, 52173
3) po # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Les raisons sont expliquées dans le message lié.) Je me rends compte que GeoPy renvoie des adresses dans un certain format - en fonction du géocodeur utilisé (quel format résultant est hors du contrôle de GeoPy), mais les adresses peuvent regarder toutes sortes de façons dans un certain (comme avoir des virgules), et il est important de savoir que les adresses normalisées n'ont pas de virgule (selon la publication USPS 28).
J'ai aidé à travailler sur une API récemment appelée LiveAddress ; il vient d'être mis à niveau pour prendre en charge le géocodage et l'analyse d'adresses sur une seule ligne.
GeoPy est conçu pour géocoder, pas pour analyser les composants (cette tâche est en fait vraiment difficile pour des raisons que je n'entrerai pas ici). LiveAddress sera , cependant, componentize l'adresse et le retour des coordonnées et d' autres informations sur l'adresse, et seulement si les adresses sont réels; aucun résultat "deviné".
Pour analyser une adresse sur une seule ligne en composants à l'aide de Python, mettez simplement l'adresse entière dans le champ "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)
L'objet JSON résultant contiendra un components
objet qui ressemblera à ceci:
"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 réponse inclura également la combinaison de first_line et delivery_line_2 afin que vous n'ayez pas à les concaténer manuellement si vous en avez besoin.