Geopy Google v3 - 从 location.raw 中提取地址组件

问题描述

我有这个 python 脚本,我从 sql 表中获取地址列表,然后使用 Geopy 将它们传递给 googles api 以获取它们的地理编码,然后将数据写回不同的 sql 表。

我目前正试图从 address_components 中提取地址部分。

我尝试了很多方法,例如将 location.raw 转换为 Json,使用其他地址解析器(但我不在美国),但我的 Python 并不强大。我也不能直接引用列表部分,因为不同的地址会有不同的长度,所以当我稍后将它应用于数据帧时它会失败,因为列表的长度都不相同。例如loc_raw0.append(location.raw['address_components'][0]['long_name'])

我目前正在尝试使用嵌套的 For 循环来获取街道号码,然后复制其他部分。

实际情况是 k 将等于 'address_components',但是 v 将等于 '{'long_name': '46','short_name': '46','types': ['street_number']}' 而不仅仅是 'street_number'

        for k,v in location.raw.items():
            if k == 'address_components' and 'street_number' in v:
                loc_street_number.append(location.raw['long_name'])
                print(loc_street_number)

pic of list v contents

df = pd.DataFrame(sql_Query,columns=['address'])


loc_Inputaddress = []
loc_Longitude = []
loc_Latitude = []
loc_Matchedaddress = []

loc_subpremise = []
loc_street_number = []
loc_road = []
loc_locality = []
loc_AdminArea1 = []
loc_AdminArea2 = []
loc_postcode = []
loc_type = []


for address in df.address:
    try:
        inputAddress = address
        location = g.geocode(inputAddress,timeout=15)

        loc_Inputaddress.append(inputAddress)
        loc_Longitude.append(location.longitude)
        loc_Latitude.append(location.latitude)
        loc_Matchedaddress.append(location.address)
        loc_type.append(location.raw['types'][0])

        #get address type
        print(loc_type.append(location.raw['types'][0]))

        #print(location.raw['address_components'])

  
        for k,v in location.raw.items():
            if k == 'address_components' and 'street_number' in v:
                loc_street_number.append(location.raw['long_name'])
                print(loc_street_number)

    except Exception as e:
        print('Error,skipping address...',e)

解决方法

在您的代码中,v 是一个字典列表,据我所知,您需要具有 long_name 类型的字典的 street_number。这个例子应该可以帮助你:

v = [{
    "long_name": "40","short_name": "40","types": ["subpremise"]
},{
    "long_name": "46","short_name": "46","types": ["street_number"]
},{
    "long_name": "Aongatete","short_name": "Aongatete","types": ["locality","political"]
}]

# Iterate over v because it is a list
for address_component in v:
    # Check if one of the address component types is "street_number"
    if "street_number" in address_component["types"]:
        print(address_component["long_name"])
        break

# Output:
# 46

Demo in myCompiler