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
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