Ir para o conteúdo

Como usar seletores XPath para web scraping em Python

Se você deseja extrair dados de páginas da web usando Python, XPath é uma ferramenta essencial para ter em seu kit de ferramentas de web scraping. XPath fornece uma maneira de navegar pela estrutura HTML de uma página e identificar os elementos e dados exatos de que você precisa.

Neste guia, abordaremos os fundamentos do XPath e demonstraremos como você pode aproveitar seu poder para web scraping com Python. Ao final, você estará pronto para realizar uma ampla variedade de tarefas de raspagem usando XPath para extrair cirurgicamente os dados que procura.

O que é XPath?

XPath significa XML Path Language. É uma linguagem de consulta para selecionar nós de um documento XML ou HTML. Com XPath, você especifica um padrão que corresponda à estrutura do documento e ele retornará todos os elementos que correspondam a esse padrão.

Embora originalmente projetado para XML, XPath funciona tão bem com HTML, tornando-o ideal para fins de web scraping. Ele fornece uma alternativa mais poderosa e flexível aos seletores CSS ou expressões regulares.

Noções básicas de sintaxe XPath

Para começar a usar XPath, você precisará entender os blocos de construção da sintaxe XPath. Aqui estão os principais conceitos:

Selecionando nós por nome de tag

A expressão XPath mais básica é simplesmente especificar um nome de tag. Por exemplo:

  • //h1 seleciona todos os <h1> elementos de título na página
  • //p seleciona todos os <p> elementos de parágrafo
  • //img seleciona todos os <img> elementos de imagem

Selecionando nós por atributo

Você pode selecionar elementos que possuem um atributo ou valor de atributo específico usando @ sintaxe:

  • //*[@class="highlighted"] seleciona todos os elementos que possuem a classe "destacada"
  • //a[@href] seleciona tudo <a> elementos âncora que possuem um atributo href
  • //img[@alt="Logo"] seleciona <img> elementos com um texto alternativo de "Logo"

Selecionando nós por posição

Você pode selecionar nós com base em sua posição usando colchetes [] e um índice numérico:

  • //ul/li[1] seleciona o primeiro <li> item dentro de cada <ul> lista não ordenada
  • //table/tr[last()] seleciona o último <tr> linha em cada <table>
  • //ol/li[position() <= 3] seleciona os três primeiros <li> itens em cada <ol> lista ordenada

Selecionando nós por relacionamento

XPath permite navegar para cima e para baixo na árvore do documento para selecionar elementos com base em seus ancestrais, descendentes, irmãos, etc.:

  • //div[@class="content"]/* seleciona todos os elementos filhos de <div> elementos com classe "conteúdo"
  • //p/.. seleciona os elementos pais de todos <p> parágrafos
  • //h1/following-sibling::p seleciona tudo <p> elementos que são irmãos após um <h1> cabeçalho
  • //section//img seleciona tudo <img> elementos que são descendentes de um <section> em qualquer nível

Predicados e Funções

XPath oferece suporte a uma ampla variedade de predicados e funções para refinar ainda mais suas seleções:

  • //p[contains(text(),"scrapy")] seleciona <p> elementos que contêm o texto "scrapy"
  • //a[starts-with(@href,"https")] seleciona <a> elementos onde o href começa com “https”
  • //ul[count(li) > 10] seleciona <ul> elementos que contenham mais de 10 <li> Unid
  • //img[string-length(@alt) > 0] seleciona <img> elementos com um atributo alt não vazio

Usando XPath com lxml e BeautifulSoup

Agora que você entende os fundamentos da sintaxe XPath, vamos ver como você pode usá-la em Python com as populares bibliotecas lxml e BeautifulSoup. Veremos um exemplo de extração do texto do título principal da página inicial do ScrapingBee.

Analisando HTML com lxml e BeautifulSoup

Primeiro, precisamos buscar o HTML da página da web usando a biblioteca de solicitações e analisá-lo em uma estrutura em árvore que possamos consultar com XPath. Usaremos BeautifulSoup para analisar o HTML e lxml para avaliar nossas expressões XPath:

import requests
from bs4 import BeautifulSoup
from lxml import etree

html = requests.get("https://scrapingbee.com") 
soup = BeautifulSoup(html.text, "html.parser")
dom = etree.HTML(str(soup))

Aqui nós:

  1. Busque o HTML usando requests.get()
  2. Analise a string HTML em um objeto BeautifulSoup usando o html.parser
  3. Converta o objeto BeautifulSoup em uma string para que possamos analisá-lo com lxml's etree.HTML() função
  4. Analise a string em um lxml Element objeto que podemos consultar usando XPath

Construindo e avaliando expressões XPath

Agora que temos uma árvore HTML analisada, podemos construir uma expressão XPath para selecionar o principal <h1> título da página:

heading_xpath = ‘//h1‘

Para avaliar este XPath em relação ao nosso documento HTML analisado, usamos o xpath() método:

heading_elements = dom.xpath(heading_xpath)

A dom.xpath() call retornará uma lista de todos os elementos que correspondem ao nosso seletor XPath. Neste caso, deve haver apenas uma correspondência <h1> elemento.

Extraindo Texto e Atributos

Assim que tivermos uma referência ao elemento, podemos extrair facilmente seu texto e quaisquer atributos usando as propriedades do lxml:

heading_text = heading_elements[0].text
print(heading_text)
# Tired of getting blocked while scraping the web?  

Extraímos com sucesso o texto do título com apenas uma linha de XPath! Também poderíamos acessar os valores dos atributos do elemento usando get():

heading_id = heading_elements[0].get(‘id‘)  

Usando XPath com Selenium

Uma abordagem alternativa é usar Selenium para automatizar e raspar sites dinâmicos que requerem JavaScript. Selenium fornece seus próprios métodos para selecionar elementos usando strings XPath.

Configurando o Selenium WebDriver

Para começar a usar o Selenium, primeiro você precisa instalar o pacote Selenium e um driver da web para o navegador que deseja usar. Veja como você pode configurar um driver do Chrome:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver_path = "/path/to/chromedriver"  
driver = webdriver.Chrome(driver_path)

Certifique-se de baixar a versão apropriada do ChromeDriver para a instalação do Chrome e fornecer o caminho para o executável.

Encontrando Elementos com XPath

Com o driver configurado, podemos navegar até uma página web e começar a encontrar elementos. O WebDriver do Selenium fornece um find_element método que aceita um localizador XPath:

driver.get("https://scrapingbee.com")

heading_xpath = "//h1"
heading_element = driver.find_element(By.XPATH, heading_xpath)

Semelhante ao exemplo lxml, isso encontrará o primeiro <h1> elemento na página. Se você quiser encontrar todos os elementos que correspondam a um XPath, use find_elements em vez de:

paragraph_xpath = "//p"
paragraph_elements = driver.find_elements(By.XPATH, paragraph_xpath)  

Extraindo Texto e Atributos

Depois de ter uma referência a um elemento da web, você pode acessar suas propriedades, como conteúdo de texto e atributos:

heading_text = heading_element.text
print(heading_text)  
# Tired of getting blocked while scraping the web?

paragraph_id = paragraph_elements[0].get_attribute("id")

Extrair dados com Selenium e XPath é bastante simples, mas lembre-se de que o Selenium geralmente é mais lento do que usar uma biblioteca de solicitação HTTP simples, pois executa um navegador real.

Dicas e práticas recomendadas

Ao começar a usar XPath para web scraping, aqui estão algumas dicas e truques para manter em mente:

Use o Chrome DevTools para testar expressões XPath

Ao construir seletores XPath, é muito útil testá-los interativamente para garantir que correspondam ao que você espera. O Chrome DevTools fornece uma maneira fácil de fazer isso:

  1. Clique com o botão direito em um elemento e selecione "Inspecionar" para abrir o painel DevTools Elements
  2. Pressione Ctrl+F para abrir a caixa de pesquisa
  3. Insira sua expressão XPath para destacar os elementos correspondentes na página

Lidar com marcação inconsistente

Os sites existentes geralmente têm marcação HTML inconsistente ou quebrada que pode atrapalhar seus seletores XPath. É uma boa ideia usar uma biblioteca como BeautifulSoup para limpar e normalizar o HTML antes de analisá-lo com lxml.

Escreva XPath robusto e sustentável

Para minimizar as chances de seu scraper quebrar devido a alterações de layout no site de destino, tente escrever expressões XPath que sejam tão específicas quanto possível, mas não mais específicas do que o necessário. Dê preferência à seleção por propriedades semânticas, como nomes de tags, IDs e atributos de dados, em vez de confiar na estrutura específica da marcação.

Também é uma boa ideia dividir expressões XPath complexas em variáveis ​​com nomes descritivos para melhorar a legibilidade e a manutenção.

Resultados em cache para melhorar o desempenho

Se você estiver coletando grandes quantidades de dados ou acessando as mesmas páginas várias vezes, considere armazenar em cache os resultados HTML e XPath analisados ​​para evitar solicitações de rede desnecessárias e sobrecarga de análise. Você pode usar um dicionário simples ou uma solução mais robusta como MongoDB ou Redis para armazenamento em cache.

Conclusão

XPath é uma ferramenta incrivelmente poderosa para extrair dados com precisão de páginas HTML. Com um conhecimento básico da sintaxe e a capacidade de traduzir seletores CSS em seus equivalentes XPath, você pode lidar com uma ampla variedade de tarefas de web scraping.

Bibliotecas Python como lxml, BeautifulSoup e Selenium fornecem maneiras fáceis de integrar XPath em seus fluxos de trabalho de scraping. Dependendo de suas necessidades específicas e das características do site de destino, você pode escolher a abordagem que funciona melhor.

À medida que você continua sua jornada de web scraping com Python e XPath, sempre certifique-se de respeitar os termos de serviço do site e as restrições do robots.txt. E lembre-se de atualizar os fundamentos das funções e operadores XPath – você ficará surpreso com o quanto pode conseguir com apenas algumas linhas de XPath inteligente!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *