Introdução ao Web Parsing em Python com Parsel

Python, Jan-03-20255 minutos de leitura

A raspagem da Web tornou-se uma competência essencial para programadores Python, cientistas de dados e entusiastas da raspagem da Web. Quer esteja a extrair dados para análise, a construir uma ferramenta de comparação de preços ou a automatizar a extração de conteúdos, a análise da Web está no centro de cada uma destas tarefas. Mas o que torna a análise da Web eficiente e fácil para iniciantes? Entre no Parsel - umabiblioteca poderosa em Python que simplifica a análise de HTML e a extração de dados.

Introdução a Parsel

O que é o Web Parsing e porque é importante?

Parsel é uma biblioteca Python leve concebida para análise HTML/XML e extração de dados. Construído com a raspagem da web em mente, o Parsel facilita a interação com estruturas de páginas da web usando seletores poderosos como XPath e CSS. Estas ferramentas permitem-lhe localizar e extrair elementos ou atributos específicos de páginas Web com precisão. A integração do Parsel com o ecossistema Python também significa que ele funciona perfeitamente com bibliotecas como `requests` e `httpx` para buscar conteúdo da web.

Principais caraterísticas do Parsel

  • Suporte de selectores: Utilize XPath para uma navegação de caminho detalhada ou selectores CSS para uma sintaxe mais simples.
  • Flexibilidade: Suporta múltiplas tarefas de análise HTML/XML, desde a simples extração de texto até ao tratamento de elementos profundamente aninhados.
  • Escalabilidade: O Parsel pode extrair dados de uma única página ou de várias páginas através de estruturas de looping.
  • Integração com Scrapy: A compatibilidade do Parsel se estende naturalmente ao Scrapy, um popular framework de raspagem da web.

Casos de utilização comuns

  • Web Scraping: Extração de dados de sítios Web de comércio eletrónico para monitorização de preços.
  • Extração de dados: Recolha de informações de contacto ou dados de pesquisa de registos públicos.
  • Automatização: Simplificação de tarefas repetitivas, como o descarregamento de especificações de produtos.

Compreender os selectores e a análise de HTML

O que é análise de HTML?

A análise HTML é o processo de decompor um documento HTML nos seus componentes estruturais, tais como etiquetas, atributos e o Modelo de Objeto de Documento (DOM). O Parsel utiliza esta estrutura para localizar e extrair com precisão os dados de que necessita.

Os documentos HTML são construídos utilizando:

  • Etiquetas: Definir o tipo de elemento (por exemplo, <h1>, <p>, <img>).
  • Atributos: Fornecer informações adicionais sobre um elemento (por exemplo, id, classe, href).
  • DOM: Uma representação hierárquica da página Web, que permite a navegação entre elementos.

O que são selectores?

Os selectores XPath e CSS são linguagens de consulta utilizadas para selecionar elementos num documento HTML:

  • XPath: Poderoso e rico em funcionalidades, o XPath permite-lhe selecionar nós com base no seu caminho no DOM, relações pai-filho e condições.
  • Seletores CSS: Uma sintaxe mais simples frequentemente utilizada no desenvolvimento front-end, ideal para selecionar elementos com base em classes, IDs ou pseudo-selectores.

Leia mais sobre os Selectores aqui.

Pré-requisitos

Antes de começar a utilizar o Parsel, certifique-se do seguinte:

  • Python instalado: Descarregue e instale o Python a partir de
  • Instalar as bibliotecas necessárias(parsel, requests): 
pip install parsel requests

Técnicas de análise para análise de HTML

Extração de elementos por ID e classe

O Parsel permite-nos analisar um elemento conhecendo simplesmente o seu nome de classe ou ID. Isto é particularmente útil quando se pretende selecionar elementos específicos de uma página Web para extração de dados.

Para demonstrar, vamos utilizar o seguinte exemplo de sítio web. Vamos concentrar-nos na extração de dados de um elemento com o nome de classe produto_podque representa um único registo contabilístico.

Segue-se um exemplo da sua estrutura HTML:

Deste elemento, vamos extrair:

  • Título do livro
  • Preço do livro
  • Estado de disponibilidade

Exemplo de código Python

importar pedidos
from parsel import Seletor

# Vai buscar a página web
url = "https://books.toscrape.com/"
resposta = requests.get(url)
seletor = Seletor(response.text)

# Selecionar o primeiro produto por classe
produto = seletor.css("artigo.produto_pod").get()

# Analisar os detalhes do produto selecionado
selector_produto = Seletor(text=produto)
title = product_selector.css("h3 a::attr(title)").get()
preço = product_selector.css("p.price_color::text").get()
disponibilidade = product_selector.css("p.instock.availability::text").get().strip()

imprimir("Título:", título)
print("Preço:", preço)
print("Disponibilidade:", disponibilidade)

Explicação do guião:

  • Obter a página Web: O script envia um OBTER para o sítio Web de exemplo para obter o seu conteúdo HTML.
  • Selecionar o bloco de produtos: Utiliza o seletor CSS artigo.produto_pod para selecionar a primeira entrada de livro da página.
  • Analisar os detalhes do produto: O script extrai o título, preçoe disponibilidade visando etiquetas e atributos HTML específicos dentro do produto_pod bloco.
  • Apresentar os resultados: Os dados extraídos são impressos na consola num formato legível.

Exemplo de saída

Título: Uma Luz no Sótão
Preço: R$50,00
Disponibilidade: Em stock

Extrair texto de elementos

O Parsel facilita a extração de texto de elementos HTML, quer se trate de um título, de uma descrição ou de outro conteúdo visível numa página Web.

Para demonstrar, vamos utilizar o mesmo exemplo de sítio web novamente. Vamos concentrar-nos na extração do texto do título de um único livro utilizando a função h3 aninhada dentro de um elemento de artigo com a classe produto_pod.

Segue-se um exemplo da sua estrutura HTML:

Deste elemento, vamos extrair:

  • O texto do título do livro

Exemplo de código Python

importar pedidos
from parsel import Seletor

# Vai buscar a página web
url = "https://books.toscrape.com/"
resposta = requests.get(url)
seletor = Seletor(response.text)

# Selecionar o primeiro produto por classe
produto = seletor.css("artigo.produto_pod").get()

# Analisar o texto do título do produto selecionado
selector_produto = Seletor(texto=produto)

texto_título = product_selector.css("h3 a::attr(title)").get()
print("Texto do título:", texto_título)

Explicação do guião:

  • Obter a página Web: O script envia um OBTER para obter o conteúdo HTML do sítio Web.
  • Selecionar o bloco de produtos: O artigo.produto_pod O seletor CSS visa a primeira entrada do livro.
  • Extrair o texto do título: Utilizar h3 a::attr(title)o script extrai o atributo title do ficheiro <a> aninhada na etiqueta <h3> tag.
  • Mostra o resultado: O título extraído é impresso na consola.

Exemplo de saída

Texto do título: Uma luz no sótão

Extração de atributos (por exemplo, `href`, `src`, `alt`)

O Parsel também nos permite extrair valores de atributos, como href, src ou alt, de elementos HTML. Esses atributos geralmente contêm dados valiosos como URLs, fontes de imagem ou texto descritivo.

Vamos concentrar-nos em extrair a ligação (href) para a página de pormenor de um livro a partir do <a> dentro de uma etiqueta artigo elemento com a classe produto_pod.

Segue-se um exemplo da sua estrutura HTML:

Deste elemento, vamos extrair:

  • A ligação (href) para a página de pormenor do livro

Exemplo de código Python

importar pedidos
from parsel import Seletor

# Vai buscar a página web
url = "https://books.toscrape.com/"
resposta = requests.get(url)
seletor = Seletor(response.text)

# Selecionar o primeiro produto por classe
produto = seletor.css("artigo.produto_pod").get()

# Analisar o atributo 'href' do produto selecionado
selector_produto = Seletor(text=produto)
book_link = product_selector.css("h3 a::attr(href)").get()

print("Link do livro:", link_do_livro)

Explicação do guião:

  • Obter a página Web: O script envia um pedido GET para obter o conteúdo HTML do sítio Web.
  • Selecione o bloco do produto: O seletor CSS article.product_pod visa a primeira entrada de livro.
  • Extrair o atributo href: Utilizando h3 a::attr(href), o script extrai o valor href da etiqueta aninhada na etiqueta.
  • Exibir o resultado: O URL extraído é impresso na consola.

Exemplo de saída

Ligação ao livro: catalogue/a-light-in-the-attic_1000/index.html

Extração de listas de elementos

O Parsel simplifica a extração de vários elementos de uma página da Web usando seletores CSS ou XPath. Isso é especialmente útil quando se trabalha com listas, como títulos de produtos, links ou preços.

Vamos concentrar-nos na extração de uma lista de todos os títulos de livros apresentados na página inicial do Web site de exemplo que estamos a utilizar para este tutorial.

Segue-se um exemplo da estrutura HTML relevante:

A partir destes elementos, extraímos:

  • Os títulos de todos os livros apresentados na página inicial

Exemplo de código Python

importar pedidos
from parsel import Seletor

# Vai buscar a página web
url = "https://books.toscrape.com/"
resposta = requests.get(url)
seletor = Seletor(response.text)

# Selecionar todos os títulos de livros
títulos_dos_livros = seletor.css("article.product_pod h3 a::attr(title)").getall()

# Imprimir cada título
for title in book_titles:
   print("Título:", título)

Explicação do guião:

  • Obter a página Web: O script envia um OBTER para obter o conteúdo HTML do sítio Web.
  • Selecionar todos os títulos: Utilizar o CSS seletor article.product_pod h3 a::attr(title), seleciona todos os <a> etiquetas no interior <h3> etiquetas dentro de produto_pod elementos.
  • Títulos de extractos: O .getall() obtém uma lista de todos os títulos correspondentes.
  • Apresentar resultados: Cada título da lista é impresso um a um.

Exemplo de saída

Título: Uma Luz no Sótão
Título: A gorjeta do veludo
Título: Soumission
Título: Sharp Objects

Navegação em elementos aninhados

O Parsel permite a navegação eficiente de estruturas HTML complexas e aninhadas usando seletores CSS e XPath. Isso é particularmente valioso ao extrair dados enterrados em várias camadas de tags HTML.

Iremos extrair o preço de um livro a partir do produto_pod elemento.

Segue-se um exemplo da estrutura HTML relevante:

A partir desta estrutura aninhada, vamos extrair:

  • O preço do primeiro livro

Exemplo de código Python

importar pedidos
from parsel import Seletor

# Vai buscar a página web
url = "https://books.toscrape.com/"
resposta = requests.get(url)
seletor = Seletor(response.text)

# Selecionar o primeiro produto por classe
produto = seletor.css("artigo.produto_pod").get()

# Analisar o elemento de preço aninhado
selector_produto = Seletor(text=produto)
preço = product_selector.css("div.product_price p.price_color::text").get()

print("Preço:", preço)

Explicação do guião:

  • Vai buscar a página web: O script recupera o conteúdo HTML da página Web utilizando pedidos.
  • Selecionar o primeiro bloco de produtos: Tem como alvo a primeira etiqueta de artigo com a classe produto_pod.
  • Navegar para o elemento de preço aninhado: Utilizar o CSS seletor div.product_price p.price_color, navega para a div e seleciona o p que contém o preço.
  • Extrair o texto do preço: O .get() recupera o valor do preço.
  • Visualizar o resultado: O preço extraído é impresso.

Exemplo de saída

Preço: R$ 50,00

Analisar tabelas e listas

O Parsel simplifica o processo de extração de dados estruturados de listas HTML e formatos tipo tabela. Os sites da Web geralmente exibem informações em padrões repetitivos, como grades de produtos ou listas ordenadas, tornando o Parsel uma ferramenta essencial para capturar esses dados com eficiência.

Como exemplo, vamos trabalhar novamente com o mesmo exemplo de sítio web. O nosso objetivo é extrair uma lista de títulos de livros juntamente com os respectivos preços. Especificamente, o nosso objetivo será o <ol> que contém várias etiquetas <li> elementos, cada um representando um livro individual.

Segue-se um exemplo da estrutura HTML relevante:

A partir desta estrutura, vamos extrair:

  • O título de cada livro
  • O preço de cada livro

Exemplo de código Python

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

Explicação do guião:

  • Obter a página Web: O script envia um pedido GET para ir buscar o conteúdo HTML do sítio Web.
  • Selecionar todos os itens do livro: O seletor ol.row li.artigo visa todos <li> elementos dentro da lista ordenada (<ol>), que representam itens de livros individuais.
  • Extrair o título e o preço: h3 a::attr(title) extrai o atributo title do ficheiro <a> etiqueta. --- p.price_color::text extrai o texto do preço do ficheiro <p> tag.
  • Mostrar os resultados: O guião imprime o título e o preço de cada livro.

Exemplo de saída

Título: A Luz no o Sótão | Preço: £51.77
Título: A gorjeta o Veludo | Preço: £53.74
Título: Soumission | Preço: £50.10
Título: Objectos Objectos | Preço: £47.82
...

Conclusão

Neste tutorial, exploramos os fundamentos da análise da Web em Python com o Parsel. Desde a compreensão de seletores básicos até a navegação em elementos aninhados, extração de atributos e análise de listas, demonstramos como o Parsel simplifica o processo de extração de dados significativos de páginas da Web.

Eis uma breve recapitulação do que abordámos:

  • Extração de elementos por ID e classe: Elementos HTML específicos direcionados utilizando selectores CSS.
  • Extração de texto e atributos: Aprendeu como extrair conteúdo de texto e atributos como href e src de elementos.
  • Manipulação de elementos aninhados: Explorou como navegar através de relações pai-filho em estruturas HTML.
  • Listas de análise: Dados estruturados extraídos de padrões repetitivos, como tabelas ou listas de produtos.

Próximas etapas:

  • Experimente diferentes páginas Web e estruturas HTML complexas utilizando o Parsel.
  • Explorar a integração com outras bibliotecas como o Scrapy para projectos de raspagem da Web em grande escala.
  • Siga as melhores práticas de raspagem ética, como respeitar os ficheiros robots.txt e evitar sobrecarregar os servidores.

O Parsel é uma ferramenta poderosa no conjunto de ferramentas de raspagem da Web e o seu domínio abrirá inúmeras oportunidades para a recolha e análise de dados.

Boa análise!