geoPy错误:AttributeError:'NoneType'对象没有'address'属性
我有一个包含地址列表的XML文件,我想通过循环遍历这些地址并提取一些信息(比如:经纬度、距离等),使用的是geopy这个库,但我总是遇到一个错误:AttributeError: 'NoneType' object has no attribute 'address'。以下是我的代码,如果有人有任何想法,请告诉我:
import xml.etree.ElementTree as et
import urllib, json
from geopy.geocoders import Nominatim
geolocator = Nominatim()
root = et.parse('data.xml').getroot()
for child in root:
adress = child.find('adress').text + ' beer sheva'
location = geolocator.geocode(adress)
print location.address # i'm trying to acces some information here.
这是XML文件的一个示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ShelterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Shelter>
<adress>אחד העם 21</adress>
<code>1 - א</code>
<neighborhood>א</neighborhood>
</Shelter>
<Shelter>
<adress>13 שלח</adress>
<code>10 - א</code>
<neighborhood>א</neighborhood>
</Shelter>
<Shelter>
<adress>ביאליק</adress>
<code>11 - א</code>
<neighborhood>א</neighborhood>
</Shelter>
你可以看到地址是用希伯来语写的,但这应该不成问题。对于第一个地址,一切都正常,但之后就出现了错误。我猜这可能和我遍历XML文件的方式有关,有什么建议吗?
非常感谢!
1 个回答
1
首先,我建议你用这些方法来处理你的超时错误,同时替代Nominatim。
from geopy import geocoders
from geopy.exc import GeocoderTimedOut
另外,记得在Google开发者控制台注册一个API密钥。这个密钥每天限制你最多可以查询2500次,但对于你要处理的262个地址来说,这应该不是问题。完成这个步骤后,你可以很简单地进行地理编码,使用下面的代码。
g = geocoders.GoogleV3(api_key='yourApiKeyHere')
location = g.geocode(address, timeout=10)
print(location.address)
或者你也可以单独查看经度和纬度。
print(location.longitude, location.latitude)
这个版本对错误数据的处理比Nominatim要好很多,但你还是应该把所有代码放在几个try/except块里,以确保万无一失。所以你最终的代码应该像这样。
g = geocoders.GoogleV3(api_key='yourApiKeyHere')
try:
location = g.geocode(address, timeout=10)
print(location.address)
except AttributeError:
print("Problem with data or cannot Geocode."
except GeocoderTimedOut:
# possibly use recursion to have it run until it no longer runs into a timeout error
希望这对你有帮助!加油!