Lubar, tôi đã thấy bài đăng của bạn tại Stack Overflow nhưng tôi sẽ đăng một câu trả lời tương tự ở đây để thống nhất. Đó là một câu hỏi hay. Tôi làm việc trong ngành xác minh địa chỉ và đã giải quyết loại vấn đề của bạn trước đây.
Tôi đã liên kết với câu hỏi Stack Overflow này trong một bình luận; và điều quan trọng cần biết là thực sự không có gì đảm bảo về định dạng của các địa chỉ đường phố hoàn chỉnh miễn phí. Như đã đề cập trong bài đăng được liên kết, các địa chỉ đầy đủ có thể trông giống như bất kỳ trong số này:
1) 102 đường chính Anytown, tiểu bang
2) 400n 600e # 2, 52173
3) số # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(Lý do được giải thích trong bài đăng được liên kết.) Tôi nhận ra rằng GeoPy trả về các địa chỉ theo một định dạng nhất định - tùy thuộc vào trình mã hóa địa lý được sử dụng (định dạng kết quả nằm ngoài sự kiểm soát của GeoPy), nhưng địa chỉ có thể tìm mọi cách trong một số cách nhất định thành phần (như có dấu phẩy) và điều quan trọng cần biết là các địa chỉ được tiêu chuẩn hóa không có dấu phẩy (theo USPS Publication 28).
Tôi đã giúp làm việc trên một API vừa được gọi là LiveAddress ; nó chỉ được nâng cấp để hỗ trợ mã hóa địa lý và phân tích địa chỉ một dòng.
GeoPy được thiết kế để mã hóa địa lý, không phân tích thành các thành phần (nhiệm vụ đó thực sự rất khó khăn vì những lý do tôi sẽ không vào đây). Tuy nhiên, LiveAddress sẽ thành phần hóa địa chỉ và trả về tọa độ và các thông tin khác về địa chỉ và chỉ khi địa chỉ là có thật; không có kết quả "đoán".
Để phân tích một địa chỉ một dòng thành các thành phần bằng Python, chỉ cần đặt toàn bộ địa chỉ vào trường "đường phố":
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)
Đối tượng JSON kết quả sẽ chứa một components
đối tượng trông giống như thế này:
"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"
}
Phản hồi cũng sẽ bao gồm kết hợp First_line và Delivery_line_2 kết hợp để bạn không phải ghép nối thủ công nếu bạn cần chúng.