Você pode facilmente retirar estas informações da wikipedia.
A melhor alternativa é usar SPARQL junto ao Wikidata, o que pode ser um pouco intimidador, mas oferece uma maneira muito eficiente e precisa para acessar e manipular dados da wikipedia.
Aqui esta um exemplo de uma query que retorna todos municipios do Brasil - que tem a data de fundação registrada - ordernados pela data de fundação.
SELECT ?cityLabel ?foundation WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "pt-br". }
?city wdt:P31 wd:Q3184121;
wdt:P17 wd:Q155;
wdt:P571 ?foundation.
}
ORDER BY ASC(?foundation)
Você pode executar, entender e acessar os resultados desta query diretamente em
https://w.wiki/7Jrf
Muito mais elegante do que alternativa de "parsear" os dados na unha né?
Mas, também funciona.
import re
from collections import Counter
import wikipediaapi
def next_city(page):
links = page.links
for title in sorted(links.keys()):
yield links[title]
def extract_dates(text):
date_pattern = r'\b\d{4}\b'
return re.findall(date_pattern, text)
def count_years(dates):
year_counter = Counter(dates)
return year_counter
def guess_foundation_year(text):
return count_years(extract_dates(text)).most_common(1)
wiki = wikipediaapi.Wikipedia(user_agent='wikipediaapi',language='pt',
extract_format=wikipediaapi.ExtractFormat.WIKI)
cities = wiki.page('Lista_de_municípios_do_Brasil')
for city in next_city(cities):
year = None
cityFoundation = city.section_by_title('Fundação')
if (cityFoundation):
year = guess_foundation_year(cityFoundation.text)
else:
cityHistory = city.section_by_title('História')
if (cityHistory):
year = guess_foundation_year(cityHistory.text)
if (year):
print(city.title, year[0][0])
Que gera os seguintes resultados:
Abadia de Goiás 1997
Abadia dos Dourados 1882
Abaetetuba 1635
Abaré 1962
Abatiá 1947
Abaíra 1879
Abel Figueiredo 1991
Abre Campo 1755
Abreu e Lima 1982
Acajutiba 1918
Acaraú 1849
Acará (Pará) 1833