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