Attention à l'utilisation de "contains" dans tes requêtes XPath
Table des matières
Aujourd'hui, j'aimerais attirer ton attention sur un petit détail que tu dois garder en tête quand tu joues avec XPath.
Quand tu utilises la fonction contains
, pour vérifier par exemple si une balise contient une classe CSS spécifique, il y a de fortes chances que tu écrives ton expression de cette façon :
//*[contains(@class, "link")]
Traduction : je cherche tous les éléments ayant une classe CSS appelée "link".
Le souci, c'est qu'en réalité, tu vas non seulement cibler les éléments contenant la classe "link" mais aussi – potentiellement – ceux contenant en partie la chaîne de caractères "link". Par exemple : "firstlink", "lastlink", "links", etc.
Si ton intention est de récupérer uniquement les éléments avec la classe "link", tu risques donc de viser trop large.
J'en ai moi-même fait l'expérience lors du développement d'Affiloop. J'utilisais des expressions XPath beaucoup trop "permissives", ce qui créait des effets de bord indésirables.
Mais en fouillant un peu sur le web, j'ai trouvé la solution.
La solution, c'est d'ajouter des espaces avant et après la classe qui t'intéresse, en utilisant la fonction concat
.
Ce qui donne par exemple :
//*[contains(concat(" ", @class, " "), " link ")]
Traduction : je cherche tous les éléments ayant une classe CSS dont le nom, entouré d'espaces, correspond à " link ".
Et hop, plus aucun risque de cibler autre chose que la classe "link".
Voilà, j'espère que ça te sera utile pour tes opérations de scraping !
- Partager sur Twitter
- Partager sur Facebook
- Partager sur LinkedIn
- Partager sur Pinterest
- Partager par E-mail
- Copier le lien
Un Template Google Sheets Offert ! 🎁
Rejoins ma newsletter et reçois une astuce SEO chaque mercredi ! En cadeau, je t'offre un template Google Sheets avec 50 fonctions de scraping prêtes à l'emploi.