Работаю над этим для школьного проекта. Я в основном соскребаю IP-адреса из истории Википедии. Затем я запускаю IP-адреса через API ipstack.com и получаю lat и long. Затем я пытаюсь подтолкнуть широту и долготу к API opencage, но здесь я сталкиваюсь с проблемой. Если я жестко закодирую лат и долго в это возвращаю город.
result = geocoder.opencage([latitude, longitude], key=key, method='reverse')
print(result.city)
Но когда я пытаюсь перебрать длинный и длинный список, я получаю сообщение об ошибке
TypeError: cannot convert the series to <class 'float'>
Я думаю, что это может быть связано с типом серии, но, опять же, я могу быть совершенно не прав. Есть идеи?
from bs4 import BeautifulSoup
import requests
from urllib.request import urlopen
import pandas as pd
import re
from opencage.geocoder import OpenCageGeocode
import geocoder
response = requests.get("https://en.wikipedia.org/w/index.php?title=Gun_laws_in_New_Hampshire&action=history")
soup = BeautifulSoup(response.text, "lxml")
bdi_text = []
for bdi_tag in soup.find_all('bdi'):
bdi_text.append(bdi_tag.text)
ip_addresses = []
for element in bdi_text:
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', element)
if len(ip) > 0:
ip_addresses.append(ip)
api_key = '?access_key={YOUR_API_ACCESS_KEY}'
resolved_ips = []
for ips in ip_addresses:
api_call = requests.get('http://api.ipstack.com/' + ips[0] + api_key).json()
resolved_ips.append(api_call)
ip_df = pd.DataFrame.from_records(resolved_ips)
ip_df = ip_df[['city','country_code','latitude','longitude']]
key = 'my_API_key'
latitude = ip_df['latitude']
longitude = ip_df['longitude']
result = []
print(len(latitude))
for latlong in range(0,len(latitude)):
result = geocoder.opencage([latitude, longitude], key=key, method='reverse')
print(result.city)
2 ответа
Ваша реализация грубая. Я бы сделал что-то подобное
def make_city(row):
result = geocoder.opencage(float(row['latitude']), #lat of target
float(row['longitude']), #long of target
key=key, #API key that I will keep to myself
method='reverse')
print(result.city)
ip_df.apply(make_city, axis = 1)
Я думаю, что его путают с типом, который вы передаете:
Не уверен в точной структуре ваших данных, но попробуйте это:
latitude = ip_df['latitude'].astype(float)
longitude = ip_df['longitude'].astype(float)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.