Voltar ao blogue
Guias
Andrei OgiolanLast updated on Mar 31, 20269 min read

Descubra como extrair dados de uma tabela HTML com Python

Descubra como extrair dados de uma tabela HTML com Python

Introdução

O web scraping é uma ferramenta poderosa que permite extrair dados de sites e utilizá-los para diversos fins, tais como mineração de dados, análise de dados e aprendizagem automática. Uma tarefa comum no web scraping é a extração de dados de tabelas HTML, que podem ser encontradas em diversos sites e são utilizadas para apresentar dados num formato estruturado e tabular. Neste artigo, aprenderemos a utilizar Python para extrair dados de tabelas HTML e armazená-los num formato fácil de trabalhar e analisar.

No final deste artigo, terá as competências e os conhecimentos necessários para criar o seu próprio scraper web capaz de extrair dados de tabelas HTML e utilizá-los para diversos fins. Quer seja um cientista de dados que pretende recolher dados para o seu próximo projeto, um empresário que pretende recolher dados para estudos de mercado ou um programador que pretende criar a sua própria ferramenta de web scraping, este artigo constituirá um recurso valioso para dar os primeiros passos na extração de tabelas HTML utilizando Python.

O que são tabelas HTML?

As tabelas HTML são um tipo de elemento em HTML (Hypertext Markup Language) utilizado para representar dados tabulares numa página web. Uma tabela HTML é composta por linhas e colunas de células, que podem conter texto, imagens ou outros elementos HTML. As tabelas HTML são criadas utilizando o elemento table e são estruturadas utilizando os elementos ‘<tr>’ (linha da tabela), ‘<td>’ (célula da tabela), ‘<th>’ (cabeçalho da tabela), ‘<caption>’, ‘<col>’, ‘<colgroup>’, ‘<tbody>’ (corpo da tabela), ‘<thead>’ (cabeçalho da tabela) e ‘<tfoot>’ (rodapé da tabela). Vamos agora analisar cada um deles em mais pormenor:

  • elemento table: Define o início e o fim de uma tabela HTML.
  • Elemento tr (linha da tabela): Define uma linha numa tabela HTML.
  • Elemento td (célula da tabela): Define uma célula numa tabela HTML.
  • Elemento th (cabeçalho da tabela): Define uma célula de cabeçalho numa tabela HTML. As células de cabeçalho são apresentadas em negrito e centradas por predefinição, e são utilizadas para identificar as linhas ou colunas da tabela.
  • Elemento caption: Define uma legenda ou título para uma tabela HTML. A legenda é normalmente apresentada acima ou abaixo da tabela.
  • Elementos col e colgroup: Definem as propriedades das colunas numa tabela HTML, tais como a largura ou o alinhamento.
  • Elementos tbody, thead e tfoot: Definem as secções corpo, cabeçalho e rodapé de uma tabela HTML, respetivamente. Estes elementos podem ser utilizados para agrupar linhas e aplicar estilos ou atributos a uma secção específica da tabela.

Para uma melhor compreensão deste conceito, vamos ver como é uma tabela HTML:

À primeira vista, parece uma tabela normal e não conseguimos ver a estrutura com os elementos acima descritos. Isso não significa que não estejam presentes, significa que o navegador já analisou isso por nós. Para poder ver a estrutura HTML, é necessário ir um passo mais além e utilizar ferramentas de desenvolvimento. Pode fazê-lo clicando com o botão direito do rato na página, clicando em «Inspecionar», clicando na ferramenta «Selecionar elemento» e clicando no elemento (neste caso, a tabela) cuja estrutura HTML pretende ver. Depois de seguir estes passos, deverá ver algo semelhante a isto:

As tabelas HTML são frequentemente utilizadas para apresentar dados num formato estruturado e tabular, como por exemplo para tabular resultados ou exibir o conteúdo de uma base de dados. Podem ser encontradas numa grande variedade de sites e são um elemento importante a ter em conta ao extrair dados da web.

Configuração

Antes de começarmos a extrair dados de tabelas HTML, precisamos de configurar o nosso ambiente e certificar-nos de que temos todas as ferramentas e bibliotecas necessárias instaladas. O primeiro passo é certificar-se de que tem o Python instalado no seu computador. Se não tiver o Python instalado, pode descarregá-lo a partir do site oficial do Python (https://www.python.org/) e seguir as instruções para o instalar.

Em seguida, precisaremos de instalar algumas bibliotecas que nos ajudarão a extrair dados de tabelas HTML. Algumas das bibliotecas mais populares para web scraping em Python são a Beautiful Soup, o Selenium e o Scrapy. Neste artigo, o foco será na utilização da Beautiful Soup, uma vez que é muito simples em comparação com as outras. A Beautiful Soup é uma biblioteca que facilita a análise de documentos HTML e XML, sendo particularmente útil para extrair dados de páginas web. Embora isto seja suficiente para extrair os dados HTML que procuramos, o formato HTML não será muito legível para o olho humano, pelo que poderá querer analisar os dados de alguma forma. É neste momento que a biblioteca Pandas entra em ação.

O Pandas é uma biblioteca de análise de dados que fornece ferramentas para trabalhar com dados estruturados, tais como tabelas HTML. Pode instalar estas bibliotecas utilizando o gestor de pacotes pip, que está incluído no Python:

$ pip install beautifulsoup4 pandas

Depois de ter o Python e as bibliotecas necessárias instaladas, está pronto para começar a extrair dados de tabelas HTML. Na próxima secção, iremos percorrer os passos para construir um scraper web capaz de extrair dados de uma tabela HTML e armazená-los num formato estruturado.

Vamos começar a extrair

Agora que temos o nosso ambiente configurado e um conhecimento básico sobre tabelas HTML, podemos começar a construir um scraper web para extrair dados de uma tabela HTML. Nesta secção, vamos percorrer os passos para construir um scraper simples capaz de extrair dados de uma tabela e armazená-los num formato estruturado.

O primeiro passo é utilizar a biblioteca requests para enviar um pedido HTTP à página web que contém a tabela HTML que pretendemos extrair.

Pode instalá-la usando o pip, como qualquer outro pacote Python:

$ pip install requests

Esta biblioteca permite-nos recuperar o conteúdo HTML de uma página web como uma string:

import requests

url = 'https://www.w3schools.com/html/html_tables.asp'

html = requests.get(url).text

Em seguida, utilizaremos a biblioteca BeautifulSoup para analisar o conteúdo HTML e extrair os dados da tabela. A BeautifulSoup fornece uma variedade de métodos e atributos que facilitam a navegação e a extração de dados de um documento HTML. Aqui está um exemplo de como utilizá-la para localizar o elemento da tabela e extrair os dados das células:

soup = BeautifulSoup(html, 'html.parser')

# Find the table element

table = soup.find('table')

# Extract the data from the cells

data = []

for row in table.find_all('tr'):

   cols = row.find_all('td')

   # Extracting the table headers

   if len(cols) == 0:

       cols = row.find_all('th')

   cols = [ele.text.strip() for ele in cols]

   data.append([ele for ele in cols if ele])  # Get rid of empty values

print(data)


A matriz de dados 2D está agora preenchida com os valores das linhas e colunas da tabela. Para que seja mais legível para nós, podemos passar o conteúdo para um Dataframe do Pandas muito facilmente agora:

import pandas as pd

# Getting the headers from the data array

# It is important to remove them from the data array afterwards in order to be parsed correctly by Pandas

headers = data.pop(0)

df = pd.DataFrame(data, columns=headers)

print(df)

Depois de extrair os dados da tabela, pode utilizá-los para diversos fins, tais como análise de dados, aprendizagem automática ou armazenamento numa base de dados. Também pode modificar o código para extrair várias tabelas da mesma página web ou de várias páginas web.

Tenha em mente que nem todos os sites na Internet são tão fáceis de extrair dados. Muitos deles implementaram medidas de proteção de alto nível destinadas a impedir a extração, como CAPTCHA e bloqueio de endereços IP, mas, felizmente, existem serviços de terceiros, como o WebScrapingAPI, que oferecem rotação de IP e contorno de CAPTCHA, permitindo-lhe extrair esses alvos.

Espero que esta secção tenha fornecido uma visão geral útil do processo de extração de dados de uma tabela HTML utilizando Python. Na próxima secção, discutiremos algumas das formas de melhorar este processo e as melhores práticas de web scraping.

Avançando para níveis mais avançados

Embora o scraper que criámos na secção anterior seja funcional e consiga extrair dados de uma tabela HTML, há várias formas de o melhorar e otimizar para o tornar mais eficiente e eficaz. Aqui ficam algumas sugestões:

  • Lidar com a paginação: Se a tabela HTML que está a extrair se estender por várias páginas, terá de modificar o scraper para lidar com a paginação e extrair dados de todas as páginas. Normalmente, isto pode ser feito seguindo links ou utilizando um controlo de paginação, como um botão «seguinte», para navegar para a página seguinte de dados.
  • Lidar com AJAX: Se a tabela HTML for gerada usando AJAX ou JavaScript, poderá ser necessário usar uma ferramenta como o Selenium para executar o JavaScript e carregar os dados na tabela. O Selenium é uma biblioteca de testes web que pode simular a interação de um utilizador com uma página web e permite-lhe extrair dados gerados dinamicamente. Uma boa alternativa a isso é usar o nosso scraper, que pode devolver os dados após o JavaScript ser renderizado na página. Pode saber mais sobre isto consultando a nossa documentação.
  • Tratamento de erros: É importante tratar erros e exceções de forma adequada no seu scraper, uma vez que problemas de rede ou de servidor podem fazer com que as solicitações falhem ou que os dados fiquem incompletos. Pode utilizar blocos try/except para detetar exceções e tratá-las adequadamente, como por exemplo, repetindo a solicitação ou registando o erro.
  • Dimensionamento do scraper: Se precisar de extrair uma grande quantidade de dados de várias tabelas ou websites, poderá ter de dimensionar o seu scraper para lidar com o aumento da carga de trabalho. Isto pode ser feito utilizando técnicas como o processamento paralelo ou a distribuição do trabalho por várias máquinas.

Ao melhorar e otimizar o seu scraper web, pode extrair dados de forma mais eficiente e eficaz, e garantir que o seu scraper é fiável e escalável. Na próxima secção, discutiremos por que razão utilizar um serviço de scraper profissional pode ser uma opção melhor do que criar o seu próprio scraper.

Resumo

Neste artigo, abordámos os conceitos básicos do web scraping e mostrámos-lhe como criar um scraper simples em Python para extrair dados de uma tabela HTML. Embora criar o seu próprio scraper possa ser um exercício útil e educativo, há várias razões pelas quais utilizar um serviço profissional de scraping pode ser uma opção melhor em muitos casos:

  • Os scrapers profissionais são normalmente mais fiáveis e eficientes, uma vez que são concebidos e otimizados para o web scraping em grande escala.
  • Os scrapers profissionais têm frequentemente funcionalidades e capacidades que não estão disponíveis em scrapers caseiros, tais como suporte para CAPTCHAs, limitação de taxa e tratamento de AJAX e JavaScript.
  • A utilização de um scraper profissional pode poupar-lhe tempo e recursos, uma vez que não tem de criar e manter o seu próprio scraper.
  • Os scrapers profissionais oferecem frequentemente várias opções de preços e podem ser mais económicos do que criar o seu próprio scraper, especialmente se precisar de extrair grandes quantidades de dados.

Embora criar o seu próprio scraper possa ser uma experiência gratificante, em muitos casos pode ser mais prático e económico utilizar um serviço de scraper profissional. No final, a decisão de criar o seu próprio scraper ou utilizar um serviço profissional dependerá das suas necessidades e recursos específicos.

Espero que este artigo tenha fornecido uma visão geral útil sobre web scraping e o processo de criação de um scraper simples de tabelas HTML com Python.

Sobre o autor
Andrei Ogiolan, Desenvolvedor Full Stack @ WebScrapingAPI
Andrei OgiolanDesenvolvedor Full Stack

Andrei Ogiolan é um programador Full Stack na WebScrapingAPI, contribuindo em todas as áreas do produto e ajudando a criar ferramentas e funcionalidades fiáveis para a plataforma.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.