In [ ]:
import requests
In [ ]:
req = requests.get("https://pt.wikipedia.org/wiki/Unidades_federativas_do_Brasil")
In [ ]:
from bs4 import BeautifulSoup
In [ ]:
bs = BeautifulSoup(req.text, "html.parser")
In [ ]:
print(bs.prettify())
In [ ]:
print(bs.h1.string)
In [ ]:
bs.h1
In [ ]:
bs.a
Note que apenas um único link foi retornado. Para retornar todos precisamos utilizar um método chamado findall()
.
In [ ]:
links = bs.findAll('a')
print(links)
In [ ]:
print(type(links))
Note que além dos links, tem outras informações.
In [ ]:
links[3]
Para imprimir/salvar apenas os links, precisamos iterar na lista que foi criada para pegar apenas o conteúdo do href.
In [ ]:
for link in links:
print(link.get("href"))
É importante verificar que estamos trazendo todos os links (internos e externos) com essa abordagem.
Como vimos, iremos recuperar a tabela que está disponível na página, que lista todos os estados do Brasil, adicionando outras informações, como a abreviação, capital, area, população, mortalidade infantil, entre outras.
Existem duas formas de recuperarmos a tabela correta. A primeira, seria recuperar todas as tabelas disponível, iterar em cada uma delas e verificar a classe que ela pertecem.
A outra forma, é mais rápida e simples. No navegador Chrome, abrar a página em questão, clique com o Botão Direito em cima da tabela que deseja recuperar e depois clique em Inspecionar (Ctrl + Shift + I) e copie o nome da classe.
<table class="wikitable sortable jquery-tablesorter" style="text-align:center; font-size:85%">
Iremos utilizar wikitable sortable jquery-tablesorter
para recuperar somente essa tabela.
In [ ]:
tabela = bs.findAll('table',
class_='wikitable sortable')
In [ ]:
print(len(tabela))
tabela
Ótimo! Já temos a tabela recuperada.
O que iremos fazer agora é extrair as informações e adicionar em um DataFrame. Para isso precisamos iterar em cada linha (tr) e então atribuir cada elemento de tr (td) à uma variável e então adicionar a uma lista.
In [ ]:
colunas = []
cabecalho = tabela[0].findAll('tr')[0].findAll('th')
for item in cabecalho:
if not item.find('a'):
colunas.append(item.string)
else:
colunas.append(item.a.string)
In [ ]:
colunas[colunas.index('2005')]='Densidade'
In [ ]:
colunas[colunas.index('2003')]='Alfabetização'
colunas[colunas.index('2010')]='Expectativa de vida'
colunas
In [ ]:
linha = tabela[0].findAll('tr')[1].findAll('td')
In [ ]:
linha[0].find('a').get('href')
In [ ]:
linha[13].find(text=True)
In [ ]:
dados = {
'A' : [],
'B' : [],
'C' : [],
'D' : [],
'E' : [],
'F' : [],
'G' : [],
'H' : [],
'I' : [],
'J' : [],
'K' : [],
'L' : [],
'M' : [],
'N' : []
}
In [ ]:
linhas = tabela[0].findAll('tr')
for l in range(1, len(linhas)):
linha = tabela[0].findAll('tr')[l].findAll('td')
dados['A'].append(linha[0].find('a').get('href'))
dados['B'].append(linha[1].find(text=True))
dados['C'].append(linha[2].find(text=True))
dados['D'].append(linha[3].find(text=True))
dados['E'].append(linha[4].find(text=True))
dados['F'].append(linha[5].find(text=True))
dados['G'].append(linha[6].find(text=True))
dados['H'].append(linha[7].find(text=True))
dados['I'].append(linha[8].find(text=True))
dados['J'].append(linha[9].find(text=True))
dados['K'].append(linha[10].find(text=True))
dados['L'].append(linha[11].find(text=True))
dados['M'].append(linha[12].find(text=True))
dados['N'].append(linha[13].find(text=True))
In [ ]:
len(dados['L'])
Agora, basta criar o DataFrame
In [ ]:
import pandas as pd
In [ ]:
df = pd.DataFrame(columns=colunas)
df
In [ ]:
lista = list(dados.keys())
lista.sort()
print(lista)
In [ ]:
for i in range(0, len(colunas)):
df[colunas[i]] = dados[lista[i]]
In [ ]:
df.head()
In [ ]:
df_final = df.drop('Bandeira', axis=1)
In [ ]:
df_final