Lubar, ich habe Ihren Beitrag bei Stack Overflow gesehen, werde aber aus Gründen der Konsistenz hier eine ähnliche Antwort veröffentlichen. Das ist eine gute Frage. Ich arbeite in der Adressüberprüfungsbranche und habe Ihr Problem bereits zuvor angegangen.
Ich habe in einem Kommentar auf diese Stapelüberlauffrage verwiesen . und es ist wichtig zu wissen, dass es wirklich keine Garantie für das Format vollständiger Freiform-Straßenadressen gibt. Wie im verlinkten Beitrag erwähnt, können vollständige Adressen wie folgt aussehen:
1) 102 Hauptstraße Anytown, Bundesstaat
2) 400n 600e # 2, 52173
3) po # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Die Gründe werden im verlinkten Beitrag erläutert.) Mir ist klar, dass GeoPy Adressen in einem bestimmten Format zurückgibt - abhängig vom verwendeten Geocoder (welches resultierende Format außerhalb der Kontrolle von GeoPy liegt), aber Adressen können innerhalb eines bestimmten Formats auf alle möglichen Arten aussehen Komponente (wie Kommas), und es ist wichtig zu wissen, dass standardisierte Adressen keine Kommas haben (gemäß USPS-Publikation 28).
Ich habe kürzlich bei der Arbeit an einer API namens LiveAddress geholfen . Es wurde gerade aktualisiert, um Geokodierung und einzeilige Adressanalyse zu unterstützen.
GeoPy wurde entwickelt, um Geocodes zu erstellen und nicht in Komponenten zu analysieren (diese Aufgabe ist aus Gründen, auf die ich hier nicht näher eingehen werde, wirklich schwierig). LiveAddress wird jedoch die Adress- und Rückgabekoordinaten sowie andere Informationen über die Adresse komponieren , und zwar nur dann, wenn die Adressen echt sind. Keine "erratenen" Ergebnisse.
Um eine einzeilige Adresse mit Python in Komponenten zu analysieren, geben Sie einfach die gesamte Adresse in das Feld "Straße" ein:
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)
Das resultierende JSON-Objekt enthält ein components
Objekt, das ungefähr so aussieht:
"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"
}
Die Antwort enthält auch die Kombination aus first_line und Delivery_line_2, sodass Sie diese nicht manuell verketten müssen, wenn Sie sie benötigen.