Answers:
Lubar,我在Stack Overflow上看到了您的文章,但为了保持一致性,我将在此处发布类似的答案。这是一个好问题。我从事地址验证行业,以前曾解决过您的问题。
我在评论中链接到此Stack Overflow问题。而且重要的是要知道,对于完整的自由格式街道地址的格式确实不能保证。如链接文章中所述,完整的地址可能类似于以下任何一个地址:
1)州Anytown大街102号
2)400n 600e#2,52173
3)po#104 60203
4)1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5)205 1105 14 90210
(原因在链接的文章中进行了解释。)我意识到,GeoPy以某种格式返回地址-取决于所使用的地理编码器(结果格式超出了GeoPy的控制范围),但是地址可以在特定范围内以各种方式显示组成部分(例如带有逗号),并且重要的是要知道标准化的地址没有逗号(根据USPS出版物28)。
我帮助开发了一个名为LiveAddress的API ;它刚刚升级为支持地理编码和单行地址解析。
GeoPy旨在对地址进行地理编码,而不是解析为组件(由于我不会在此处介绍的原因,该任务实际上确实很困难)。但是,只有在地址是真实的情况下,LiveAddress 才会将地址组成部分并返回坐标和有关该地址的其他信息。没有“猜测”结果。
要使用Python将单行地址解析为组件,只需将整个地址放入“街道”字段即可:
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)
生成的JSON对象将包含一个components
类似于以下内容的对象:
"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"
}
响应还将包括first_line和delivery_line_2的组合,因此,如果需要它们,您不必手动将其串联起来。
编写您的json文件并不难。
import json
result = '123 Main Street, Los Angeles, CA, 90034, USA'
sp = result.split(',')
dumpJson = json.dumps({'street':sp[0], 'city': sp[1], 'state': sp[2],
'zip': sp[3], 'country': sp[4]})
>>> dumpJson
'{"city": " Los Angeles", "state": " CA", "street": "123 Main Street",
"zip": " 90034", "country": " USA"}'
我希望它可以帮助您...