Ir para o conteúdo

Como selecionar elementos por texto em XPath

Ao copiar sites, muitas vezes você precisa selecionar elementos da página com base em seu conteúdo de texto. Isso permite que você direcione com precisão os dados que deseja extrair. XPath, uma linguagem de consulta para seleção de nós em documentos XML e HTML, fornece algumas maneiras de fazer isso usando o método contains() e text() funções.

Neste guia, veremos detalhadamente como aproveitar essas técnicas de seleção de texto em suas expressões XPath. Abordaremos a sintaxe, examinaremos exemplos e discutiremos algumas práticas recomendadas para ajudá-lo a selecionar elementos de maneira eficaz por seu conteúdo de texto durante web scraping.

Usando contains() para selecionar elementos que contêm texto

O XPath contains() A função permite selecionar elementos que contêm uma substring de texto específica. São necessários dois argumentos:

  1. Um conjunto de nós para pesquisar
  2. A substring de texto a ser correspondida

A sintaxe é semelhante a:

//element[contains(text(), "substring")]

Isso selecionará todos element nós cujo conteúdo de texto contém o especificado substring.

Por exemplo, considere o seguinte HTML:

<ul>
  <li>Apples</li>
  <li>Oranges</li>
  <li>Pears and Grapes</li>
</ul>

Para selecionar tudo <li> elementos que contenham o texto "e", você usaria:

//li[contains(text(), "and")]

Isso corresponderia ao terceiro <li> elemento, "Peras e Uvas".

A contains() A função diferencia maiúsculas de minúsculas por padrão. Para realizar uma correspondência sem distinção entre maiúsculas e minúsculas, você pode usar o lower-case() or upper-case() funções para normalizar o invólucro:

//li[contains(lower-case(text()), "and")]

Uma característica fundamental de contains() é que a correspondência da substring pode abranger elementos filhos. Por exemplo, neste HTML:

<p>
  Select <em>this</em> paragraph.
</p>

O XPath //p[contains(text(), "Select this")] ainda combinaria com o <p> tag, mesmo que "Select" e "this" estejam separados pelo <em> elemento filho.

Usando text() para selecionar elementos por texto exato

Enquanto contains() é útil para correspondências parciais de texto, às vezes você precisa corresponder exatamente todo o conteúdo do texto. É aqui que text() entra a função. Ela seleciona elementos com base em seu conteúdo de texto completo.

A sintaxe é:

//element[text()="exact text"]

Por exemplo, com este HTML:

<div>
  <p>Hello world!</p>
  <p>Hello again</p>
</div>

A expressão XPath //p[text()="Hello world!"] selecionaria apenas o primeiro <p> elemento. O segundo <p> elemento não corresponde, porque seu conteúdo de texto não é exatamente "Olá, mundo!".

Diferentemente dos contains(), text() A função corresponde apenas ao conteúdo de texto direto de um elemento. Não corresponde ao texto nos elementos filhos. Por exemplo, //div[text()="Hello world!"] não corresponderia a nada no HTML acima, porque o <div> em si não contém diretamente o texto "Olá, mundo!". Esse texto está dentro do <p> elemento filho.

Como contains(), text() A função diferencia maiúsculas de minúsculas por padrão. O mesmo lower-case() or upper-case() solução alternativa pode ser usada para correspondência sem distinção entre maiúsculas e minúsculas.

Combinando seletores de texto com outras expressões XPath

Os seletores de texto tornam-se ainda mais poderosos quando combinados com outras partes das expressões XPath, como nomes de tags, atributos e seletores posicionais. Isso permite que você crie seletores bem direcionados para detalhar exatamente os elementos necessários.

Por exemplo, você poderia usar o seguinte XPath para selecionar <a> elementos contendo a palavra "click" no texto do link, mas somente se também possuírem a classe "cta-button":

//a[contains(text(), "click") and @class="cta-button"]

Ou esta expressão para selecionar o terceiro <p> elemento na página, mas apenas se o conteúdo do texto começar com "Introdução":

//p[starts-with(text(), "Introduction")][3]

Ao misturar e combinar diferentes construções XPath, você pode construir seletores muito específicos para lidar com praticamente qualquer cenário de web scraping.

Exemplos de seletores de texto com bibliotecas Python

Vejamos alguns exemplos práticos de uso de seletores de texto XPath com bibliotecas comuns de web scraping em Python.

Exemplo com lxml e solicitações

import requests
from lxml import html

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
tree = html.fromstring(page.content)

# Select all <a> elements that contain the text "click me"
links = tree.xpath(‘//a[contains(text(), "click me")]‘)

# Print the href attribute of each selected link
for link in links:
    print(link.get(‘href‘))

Exemplo com BeautifulSoup

import requests
from bs4 import BeautifulSoup

# Send a GET request to the webpage
page = requests.get(‘https://example.com‘)

# Parse the HTML content
soup = BeautifulSoup(page.content, ‘html.parser‘)

# Select the first <p> element that starts with the text "Introduction"
intro_para = soup.select_one(‘p[text^="Introduction"]‘)

print(intro_para.text)

Exemplo com Selênio

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

# Launch a browser and navigate to the webpage
driver = webdriver.Chrome()
driver.get(‘https://example.com‘)

# Select the <button> element with the exact text "Submit"
submit_button = driver.find_element(By.XPATH, ‘//button[text()="Submit"]‘)

submit_button.click()

Dicas e práticas recomendadas

Ao usar seletores de texto XPath para web scraping, lembre-se destas dicas:

  1. Esteja ciente dos espaços em branco no texto que você está tentando corresponder. Espaços extras ou caracteres de nova linha podem causar falha nos seletores. Use normalize-space() para remover espaços em branco iniciais e finais e recolher espaços em branco internos, se necessário.

  2. Preste atenção à capitalização. Por padrão, a correspondência de texto no XPath diferencia maiúsculas de minúsculas. Use minúsculas() ou maiúsculas() para correspondência sem distinção entre maiúsculas e minúsculas.

  3. Evite seletores de texto excessivamente gerais, pois eles podem corresponder a elementos indesejados. Tente combinar seletores de texto com nomes de elementos ou atributos para torná-los mais específicos.

  4. Sempre teste seus seletores em relação ao conteúdo real e atual da página. Os sites mudam com frequência, então os seletores que funcionaram ontem podem falhar hoje se o conteúdo do texto tiver sido atualizado.

  5. Se um site tiver formatação inconsistente ou conteúdo gerado pelo usuário, os seletores de texto poderão não ser confiáveis. Nesses casos, geralmente é melhor usar seletores estruturais baseados em nomes de elementos, atributos ou posição na árvore do documento.

Conclusão

XPath fornece maneiras poderosas de selecionar elementos com base em seu conteúdo de texto, usando o contains() e text() funções. contains() é útil para combinar elementos que contêm uma substring de texto específica, enquanto text() seleciona elementos pelo seu conteúdo de texto completo e exato.

Esses seletores de texto são ainda mais eficazes quando combinados com outras expressões XPath para criar seletores de elementos altamente direcionados para web scraping.

Além de apenas contains() e text(), o XPath possui diversas outras funções úteis para trabalhar com texto, como starts-with(), ends-with(), normalize-space(), e mais. Invista algum tempo aprendendo essas e outras partes importantes da sintaxe XPath.

Com um conhecimento sólido dos seletores de texto XPath, você está no caminho certo para conseguir direcionar e extrair com precisão os dados necessários das páginas da web. Boa raspagem!

Junte-se à conversa

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