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.
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.
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:
<h1>
, <p>
, <img>
).id
, classe
, href
).Os selectores XPath e CSS são linguagens de consulta utilizadas para selecionar elementos num documento HTML:
Leia mais sobre os Selectores aqui.
Antes de começar a utilizar o Parsel, certifique-se do seguinte:
pip install parsel requests
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_pod
que representa um único registo contabilístico.
Segue-se um exemplo da sua estrutura HTML:
Deste elemento, vamos extrair:
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
para o sítio Web de exemplo para obter o seu conteúdo HTML.artigo.produto_pod
para selecionar a primeira entrada de livro da página.produto_pod
bloco.Título: Uma Luz no Sótão
Preço: R$50,00
Disponibilidade: Em stock
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:
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)
OBTER
para obter o conteúdo HTML do sítio Web.produto_pod
O seletor CSS visa a primeira entrada do livro.h3 a::attr(title)
o script extrai o atributo title do ficheiro <a>
aninhada na etiqueta <h3>
tag.Texto do título: Uma luz no sótão
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:
href
) para a página de pormenor do livroimportar 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:
Ligação ao livro: catalogue/a-light-in-the-attic_1000/index.html
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:
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
para obter o conteúdo HTML do sítio Web. article.product_pod h3 a::attr(title)
, seleciona todos os <a>
etiquetas no interior <h3>
etiquetas dentro de produto_pod
elementos..getall()
obtém uma lista de todos os títulos correspondentes.Título: Uma Luz no Sótão
Título: A gorjeta do veludo
Título: Soumission
Título: Sharp Objects
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:
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:
produto_pod
.div.product_price p.price_color
, navega para a div e seleciona o p
que contém o preço..get()
recupera o valor do preço.Preço: R$ 50,00
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:
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}")
ol.row
li.artigo
visa todos <li> elementos dentro da lista ordenada (<ol>), que representam itens de livros individuais.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.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
...
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:
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!