es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encontrar coordenadas en páginas de Wikipedia iterando sobre una lista.

Probablemente esta sea una pregunta sencilla, pero mi experiencia en bucles for es muy limitada.

Estaba tratando de adaptar la solución en esta página https://www.mediawiki.org/wiki/API:Geosearch con algunos ejemplos simples que tengo, pero el resultado no es el que esperaba.

Por ejemplo:

Tengo este data frame simple:

df= pd.DataFrame({‘City’:[‘Sesimbra’,’Ciudad Juárez’,’31100 Treviso’,’Ramada Portugal’,’Olhão’],
‘Country’:[‘Portugal’,’México’,’Italia’,’Portugal’,’Portugal’]})

He creado una lista basada en las ciudades:

lista_cidades = list(df[‘City’])

y me gustaría iterar sobre esta lista para obtener las coordenadas (decimales, de preferencia)

Hasta ahora he intentado esta aproximación:

import requests

lng_dict = {}
lat_dict = {}

S = requests.Session()

URL = “https://en.wikipedia.org/w/api.php”

PARAMS = {
“action”: “query”,
“format”: “json”,
“titles”: [lista_cidades],
“prop”: “coordinates”
}
R = S.get(url=URL, params=PARAMS)
DATA = R.json()
PAGES = DATA[‘query’][‘pages’]

for i in range(len(lista_cidades)):
for k, v in PAGES.items():

    try:
        lat_dict[lista_cidades[i]] = str(v['coordinates'][0]['lat'])
        lng_dict[lista_cidades[i]] = str(v['coordinates'][0]['lon'])

    except:
        pass

pero parece que el código no itera sobre la lista y siempre devuelve la misma coordenada.

Por ejemplo, cuando llamo al diccionario con las coordenadas de latitud, esto es lo que obtengo

lng_dict

{‘Sesimbra’: ‘-7.84166667’,
‘Ciudad Juárez’: ‘-7.84166667’,
‘31100 Treviso’: ‘-7.84166667’,
‘Ramada Portugal’: ‘-7.84166667’,
‘Olhão’: ‘-7.84166667’}

¿Qué debo hacer para resolver esto?

Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el parámetro “titles” del diccionario PARAMS. En este momento, está configurado como [lista_cidades], que es una lista que contiene todas las ciudades. En su lugar, debería configurarse como una cadena que contenga el nombre de una ciudad a la vez, para iterar sobre la lista. Así es cómo puedes modificar el bucle “for” para solucionar este problema:

    for city in lista_cidades:
        PARAMS = {
            "action": "query",
            "format": "json",
            "titles": city,
            "prop": "coordinates"
        }
    
        R = S.get(url=URL, params=PARAMS)
        DATA = R.json()
        PAGES = DATA['query']['pages']
    
        for k, v in PAGES.items():
            try:
                lat_dict[city] = str(v['coordinates'][0]['lat'])
                lng_dict[city] = str(v['coordinates'][0]['lon'])
            except:
                pass
    

    De esta manera, el parámetro “titles” se establece en una ciudad a la vez, ya que itera sobre la lista de ciudades. ¡Espero que esto te ayude!

Comments are closed.