Passer au contenu

Comment sélectionner des éléments par texte dans XPath

Lors du scraping de sites Web, vous devez souvent sélectionner des éléments sur la page en fonction de leur contenu textuel. Cela vous permet de cibler précisément les données que vous souhaitez extraire. XPath, un langage de requête permettant de sélectionner des nœuds dans des documents XML et HTML, propose plusieurs façons de procéder à l'aide de l'outil contains() ainsi que text() fonctions.

Dans ce guide, nous examinerons en profondeur comment exploiter ces techniques de sélection de texte dans vos expressions XPath. Nous aborderons la syntaxe, passerons en revue des exemples et discuterons de quelques bonnes pratiques pour vous aider à sélectionner efficacement les éléments en fonction de leur contenu textuel lors du web scraping.

Utilisation de contain() pour sélectionner des éléments contenant du texte

Le XPath contains() La fonction vous permet de sélectionner des éléments contenant une sous-chaîne de texte spécifique. Il faut deux arguments :

  1. Un ensemble de nœuds dans lequel effectuer la recherche
  2. La sous-chaîne de texte à laquelle correspondre

La syntaxe ressemble à :

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

Cela sélectionnera tout element nœuds dont le contenu textuel contient le spécifié substring.

Par exemple, considérez le code HTML suivant :

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

Pour tout sélectionner <li> éléments contenant le texte "et", vous utiliseriez :

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

Cela correspondrait au troisième <li> élément "Poires et Raisins".

La contains() la fonction est sensible à la casse par défaut. Pour effectuer une correspondance insensible à la casse, vous pouvez utiliser le lower-case() or upper-case() fonctions pour normaliser le boîtier :

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

Un élément clé de contains() est que la correspondance de sous-chaîne peut s'étendre sur plusieurs éléments enfants. Par exemple, dans ce HTML :

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

Le XPath //p[contains(text(), "Select this")] correspondrait toujours au <p> balise, même si "Select" et "this" sont séparés par le <em> élément enfant.

Utilisation de text() pour sélectionner des éléments par texte exact

Tandis que contains() est utile pour les correspondances de texte partielles, vous devez parfois faire correspondre exactement l'intégralité du contenu du texte. C'est là que le text() La fonction entre en jeu. Elle sélectionne les éléments en fonction de leur contenu en texte intégral.

La syntaxe est:

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

Par exemple, avec ce HTML :

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

L'expression XPath //p[text()="Hello world!"] sélectionnerait uniquement le premier <p> élément. La deuxième <p> l'élément ne correspond pas, car son contenu textuel n'est pas exactement "Bonjour tout le monde !".

Contrairement à contains(), text() La fonction correspond uniquement au contenu textuel direct d’un élément. Il ne correspond pas au texte des éléments enfants. Par exemple, //div[text()="Hello world!"] ne correspondrait à rien dans le code HTML ci-dessus, car le <div> lui-même ne contient pas directement le texte "Hello world!". Ce texte est dans le <p> élément enfant.

Comme contains(), text() la fonction est sensible à la casse par défaut. Le même lower-case() or upper-case() Une solution de contournement peut être utilisée pour une correspondance insensible à la casse.

Combinaison de sélecteurs de texte avec d'autres expressions XPath

Les sélecteurs de texte deviennent encore plus puissants lorsqu'ils sont combinés avec d'autres parties des expressions XPath, telles que les noms de balises, les attributs et les sélecteurs de position. Cela vous permet de créer des sélecteurs très ciblés pour accéder exactement aux éléments dont vous avez besoin.

Par exemple, vous pouvez utiliser le XPath suivant pour sélectionner <a> les éléments contenant le mot « clic » dans le texte de leur lien, mais seulement s'ils ont également la classe « cta-button » :

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

Ou cette expression pour sélectionner le troisième <p> élément sur la page, mais seulement si son contenu textuel commence par « Introduction » :

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

En mélangeant et en faisant correspondre différentes constructions XPath, vous pouvez créer des sélecteurs très spécifiques pour gérer presque tous les scénarios de web scraping.

Exemples de sélecteur de texte avec les bibliothèques Python

Examinons quelques exemples pratiques d'utilisation de sélecteurs de texte XPath avec les bibliothèques de web scraping Python courantes.

Exemple avec lxml et requêtes

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‘))

Exemple avec 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)

Exemple avec le sélénium

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()

Conseils et bonnes pratiques

Lorsque vous utilisez des sélecteurs de texte XPath pour le web scraping, gardez ces conseils à l'esprit :

  1. Soyez conscient des espaces dans le texte que vous essayez de faire correspondre. Des espaces supplémentaires ou des caractères de nouvelle ligne peuvent entraîner l'échec de vos sélecteurs. Utilisez normalize-space() pour supprimer les espaces de début et de fin et réduire les espaces internes si nécessaire.

  2. Faites attention à la capitalisation. Par défaut, la correspondance de texte dans XPath est sensible à la casse. Utilisez lower-case() ou upper-case() pour une correspondance insensible à la casse.

  3. Évitez les sélecteurs de texte trop généraux, car ils peuvent correspondre à des éléments inattendus. Essayez de combiner des sélecteurs de texte avec des noms d'éléments ou des attributs pour les rendre plus spécifiques.

  4. Testez toujours vos sélecteurs par rapport au contenu réel et actuel de la page. Les sites Web changent fréquemment, de sorte que les sélecteurs qui fonctionnaient hier pourraient échouer aujourd'hui si le contenu du texte a été mis à jour.

  5. Si un site Web présente une mise en forme incohérente ou un contenu généré par l'utilisateur, les sélecteurs de texte peuvent ne pas être fiables. Dans ces cas, il est souvent préférable d'utiliser des sélecteurs structurels basés sur les noms d'éléments, les attributs ou la position dans l'arborescence du document.

Conclusion

XPath fournit des moyens puissants pour sélectionner des éléments en fonction de leur contenu textuel, en utilisant l'outil contains() ainsi que text() fonctions. contains() est utile pour faire correspondre les éléments qui contiennent une sous-chaîne de texte spécifique, tandis que text() sélectionne les éléments en fonction de leur contenu exact en texte intégral.

Ces sélecteurs de texte sont encore plus efficaces lorsqu'ils sont combinés avec d'autres expressions XPath pour créer des sélecteurs d'éléments hautement ciblés pour le web scraping.

Au-delà juste contains() ainsi que text(), XPath possède plusieurs autres fonctions utiles pour travailler avec du texte, telles que starts-with(), ends-with(), normalize-space(), et plus. Investissez du temps dans l’apprentissage de ces éléments ainsi que d’autres éléments clés de la syntaxe XPath.

Avec une solide maîtrise des sélecteurs de texte XPath, vous êtes sur la bonne voie pour pouvoir cibler et extraire avec précision les données dont vous avez besoin à partir de pages Web. Bon grattage !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *