Voltar ao blogue
Guias
Andrei Ogiolan11 de abril de 202310 min de leitura

Descobrir como extrair uma tabela HTML com Python

Descobrir como extrair 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, vamos aprender 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 da 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 dados de tabelas HTML utilizando Python.

O que são tabelas HTML?

HTML tables are a type of element in HTML (Hypertext Markup Language) that is used to represent tabular data on a web page. An HTML table consists of rows and columns of cells, which can contain text, images, or other HTML elements. HTML tables are created using the table element, and are structured using the ‘<tr>’ (table row) ,‘<td>’ (table cell), ‘<th>’ (table header), ‘<caption>’ , ‘<col>’, ‘<colgroup>’, ‘<tbody>’ (table body), ‘<thead>’ (table head) and ‘<tfoot>’ (table foot) elements. Now let’s go through each one and get in more detail:

  • elemento table: Define o início e o fim de uma tabela HTML.
  • elemento tr (linha de tabela): Define uma linha numa tabela HTML.
  • Elemento td (célula de tabela): Define uma célula numa tabela HTML.
  • Elemento (cabeçalho de 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 por cima ou por baixo da tabela.
  • elementos col e colgroup: Definem as propriedades das colunas numa tabela HTML, como a largura ou o alinhamento.
  • Elementos tbody, thead e tfoot: Definem as secções de corpo, cabeça e pé 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 compreender melhor este conceito, vamos ver como é uma tabela HTML:

Exemplo de tabela HTML com uma lista de empresas, contactos e países

À 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, mas sim que o navegador já os analisou por nós. Para poder ver a estrutura HTML, é necessário ir um pouco mais além e utilizar as 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:

Página tutorial sobre tabelas HTML com uma tabela de exemplo, acompanhada das ferramentas de desenvolvimento do navegador que destacam a marcação da tabela

As tabelas HTML são normalmente utilizadas para apresentar dados num formato estruturado e tabular, por exemplo, para tabular resultados ou apresentar o conteúdo de uma base de dados. Podem ser encontradas numa grande variedade de sítios Web 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 é verificar se 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.

A seguir, teremos de instalar algumas bibliotecas que nos ajudarão a extrair dados de tabelas HTML. Algumas das bibliotecas mais populares para a extração de dados da Web em Python são a Beautiful Soup, o Selenium e o Scrapy. Neste artigo, o foco será a utilização da Beautiful Soup, uma vez que é muito mais 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.

A Pandas é uma biblioteca de análise de dados que fornece ferramentas para trabalhar com dados estruturados, 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 instalar o Python e as bibliotecas necessárias, estará pronto para começar a extrair dados de tabelas HTML. Na próxima secção, iremos explicar passo a passo como criar um scraper da Web capaz de extrair dados de uma tabela HTML e armazená-los num formato estruturado.

Vamos começar a raspar

Agora que já temos o nosso ambiente configurado e uma compreensão básica das tabelas HTML, podemos começar a criar um scraper web para extrair dados de uma tabela HTML. Nesta secção, iremos percorrer os passos necessários para criar 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á-lo usando o pip, tal como qualquer outro pacote Python:

$ pip install requests

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

pedidos de importação

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

html = requests.get(url).text

A seguir, vamos utilizar a biblioteca BeautifulSoup para analisar o conteúdo HTML e extrair os dados da tabela. A BeautifulSoup disponibiliza 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')

# Encontrar o elemento table

table = soup.find('table')

# Extrair os dados das células

data = []

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

   cols = row.find_all('td')

   # Extrair os cabeçalhos da tabela

   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])  # Eliminar valores vazios

print(data)

A matriz de dados 2D está agora preenchida com os valores das linhas e colunas da tabela. Para que fique mais legível para nós, podemos agora transferir o conteúdo para um DataFrame do Pandas com toda a facilidade:

import pandas as pd

# Obter os cabeçalhos da matriz de dados

# É importante removê-los da matriz de dados posteriormente para que sejam analisados corretamente pelo 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 dados de várias tabelas da mesma página web ou de várias páginas web.

Tenha em atenção que nem todos os sites na Internet permitem extrair dados com tanta facilidade. Muitos deles implementaram medidas de proteção avançadas destinadas a impedir a extração de dados, tais como CAPTCHA e o bloqueio de endereços IP; felizmente, existem serviços de terceiros, como o WebScrapingAPI, que oferecem rotação de IP e contornamento de CAPTCHA, permitindo-lhe extrair dados desses alvos.

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

Avançar 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, existem várias formas de o melhorar e otimizar para torná-lo mais eficiente e eficaz. Aqui ficam algumas sugestões:

  • Lidar com a paginação: Se a tabela HTML que está a extrair estiver distribuída por várias páginas, terá de modificar o programa de extração para lidar com a paginação e extrair dados de todas as páginas. Normalmente, isto pode ser feito seguindo os 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 através de AJAX ou JavaScript, poderá ser necessário utilizar uma ferramenta como o Selenium para executar o JavaScript e carregar os dados na tabela. O Selenium é uma biblioteca de testes web capaz de simular a interação de um utilizador com uma página web e permitir-lhe extrair dados gerados dinamicamente. Uma boa alternativa a isso é utilizar o nosso scraper, que consegue 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 os erros e as 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 de forma adequada, 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 sites, poderá ser necessário 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, poderá extrair dados de forma mais eficiente e eficaz, garantindo que o seu scraper é fiável e escalável. Na próxima secção, iremos discutir por que razão recorrer a um serviço profissional de scraping pode ser uma opção mais vantajosa 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 recorrer a um serviço profissional de scraping pode ser a melhor opção em muitos casos:

  • Os scrapers profissionais são, normalmente, mais fiáveis e eficientes, uma vez que são concebidos e otimizados para a extração de dados da Web em grande escala.
  • Os scrapers profissionais dispõem frequentemente de funcionalidades e capacidades que não estão disponíveis nos scrapers caseiros, tais como suporte para CAPTCHAs, limitação de taxa e gestão de AJAX e JavaScript.
  • A utilização de um scraper profissional pode poupar-lhe tempo e recursos, uma vez que não precisa de criar e manter o seu próprio scraper.
  • Os programas de extração profissionais oferecem frequentemente várias opções de preços e podem revelar-se mais económicos do que criar o seu próprio programa de extração, 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 poderá ser mais prático e económico recorrer a um serviço profissional de scraper. Em última análise, a decisão de criar o seu próprio scraper ou de recorrer a um serviço profissional dependerá das suas necessidades e recursos específicos.

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

Sobre o autor
Andrei Ogiolan, Desenvolvedor Full Stack na 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.