1. Extração de dados de tabelas
O que tabelas e cebolas têm em comum? Isso mesmo, camadas!
Tabelas em HTML são como um bolo de camadas, formado pelos elementos
<table>
,
<tr>
(linhas),
<th>
(células de cabeçalho) e
<td>
(células comuns). Cada um desses
elementos desempenha sua função na apresentação dos dados, e para
extrair informações, é preciso acessar cada camada em sequência.
Prática, prática e mais prática!
Vamos começar com a seguinte tabela HTML simples:
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
<th>Cidade</th>
</tr>
<tr>
<td>Alice</td>
<td>29</td>
<td>Moscou</td>
</tr>
<tr>
<td>Bob</td>
<td>34</td>
<td>São Petersburgo</td>
</table>
Passo 1: Encontrando a tabela na página
Tabelas em páginas web são definidas pelas tags HTML
<table>
, e os dados na tabela estão dentro das tags
<tr>
(linhas da tabela) e <td>
(células de dados). No
BeautifulSoup
, o método find
ajuda a localizar a primeira tabela na página, enquanto find_all
obtém todas as tabelas, caso existam várias.
# Procurando a primeira tabela na página
table = soup.find("table")
Para extrair uma tabela específica, você pode refinar a busca fornecendo atributos como id
ou class
.
# Procurando uma tabela por classe
table = soup.find("table", {"class": "table-class"})
Passo 2: Extração de dados da tabela
Depois de carregar, é hora de extrair os dados. Os dados na tabela estão organizados por linhas, então faz sentido iterar sobre as linhas da tabela e extrair os dados de cada célula.
Extraindo cabeçalhos
Os cabeçalhos da tabela geralmente estão na primeira linha e são encapsulados nas tags <th>
. Usando find_all
, podemos coletar todos os cabeçalhos em uma lista.
# Extração de cabeçalhos da primeira linha da tabela
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Cabeçalhos da tabela:", headers)
Extraindo linhas de dados
Para extrair todas as linhas de dados (geralmente encapsuladas nas tags <tr>
, com cada célula em <td>
), usamos um loop aninhado: primeiro encontramos todas as linhas <tr>
, em seguida iteramos sobre as células <td>
em cada linha.
# Extraindo todas as linhas de dados
data = []
rows = table.find_all("tr")[1:] # Ignorando a primeira linha com cabeçalhos
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Dados da tabela:", data)
Esse código percorre cuidadosamente as linhas da tabela e extrai o texto de cada célula. Não parece magia? Claro, todos sabemos que não há milagre sem a magia dos loops!
2. Trabalhando com listas
Listas — os irmãos mais velhos das tabelas
Na vida, existem apenas dois objetos infinitos: tabelas e listas.
Listas são representadas pelos elementos
<ul>
(não numeradas) e
<ol>
(numeradas), e seus itens são <li>
. Diferentemente das tabelas,
listas são simples e minimalistas, tornando-as perfeitas para uma rápida e eficiente manipulação de dados!
Extraindo dados de listas
Veja o exemplo de uma lista HTML:
<ul>
<li>Maçã</li>
<li>Banana</li>
<li>Uva</li>
</ul>
Agora vamos usar nosso velho e bom BeautifulSoup
para extrair esses dados:
html = """
<ul>
<li>Maçã</li>
<li>Banana</li>
<li>Uva</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
E pronto! Uma abordagem simples mas eficaz que você pode aplicar a estruturas mais complexas.
3. Exemplo de extração e processamento de dados tabulares
Para consolidar o aprendizado, vamos tentar extrair dados de um exemplo semelhante na prática, mas com uma estrutura mais complexa:
<table id="courses">
<tr>
<th>Curso</th>
<th>Instrutor</th>
</tr>
<tr>
<td>Python para todos</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatização com Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Para extrair dados da tabela e lista, podemos configurar as consultas deste jeito:
html = """
<table id="courses">
<tr>
<th>Curso</th>
<th>Instrutor</th>
</tr>
<tr>
<td>Python para todos</td>
<td>Guido van Rossum</td>
</tr>
<tr>
<td>Automatização com Python</td>
<td>Eric Matthes</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Extraindo dados da tabela
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Extraindo dados da lista
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Esse script cobre ambos os tipos de dados. Note como usamos ids e classes para buscar elementos com precisão. Na prática, você pode se deparar com estruturas HTML mais desafiadoras, mas a abordagem permanece a mesma: começamos do nível superior, desmontamos os elementos e, finalmente, extraímos os dados preciosos!
4. Resumo e erros comuns
Trabalhar com tabelas e listas em páginas web é como navegar em um labirinto. Às vezes, você pode se deparar com dados imperfeitos, como células vazias ou elementos ausentes. Nesses casos, é importante verificar se os dados estão corretos e completos. Erros comuns incluem tentar acessar elementos inexistentes ou usar seletores incorretos. Lembre-se de que o HTML nem sempre é tão limpo e estruturado quanto gostaríamos, então sempre vale a pena considerar o tratamento de exceções e a validação dos dados.
Onde isso pode ser útil?
O conhecimento adquirido nesta aula vai te ajudar a extrair e processar dados automaticamente de várias fontes online. Por exemplo, você pode automatizar a coleta de dados de tabelas do mercado de ações, configurar o monitoramento de preços em lojas online e até realizar análises regulares de dados de blogs e sites de notícias. Dominar técnicas de extração de dados de tabelas e listas abre um mundo de possibilidades para automação e análise de dados.
GO TO FULL VERSION