Localiser un élement avec sélenium

Résolu/Fermé
Enygma - Modifié le 6 avril 2021 à 15:14
 Enygma - 6 avril 2021 à 13:08
Bonjour,

Je suis en train de déveloper un code en python en utilisant la bibliothèque sélenium.
Depuis pas mal de temps, j'essaye déseperément de localiser le "href" de la balise "a" qui se situe dans la balise "header" avec le sélecteur XPATH mais je n'y arrive pas. Je pense que je loupe quelque chose de évident mais je ne sais pas quoi si vous pourriez m'aider, ce serait super ! Voici le code HTML et mon code en python pour que vous puissiez comprendre.

<header class="v-card">
<div class="row-denom">
<div class="denomination with-noavis">
<h3 class="company-name noTrad">
<a class="denomination-links pj-lb pj-link" title="UCB Cast Profil France" data-pjsearchctx-sethref="" data-pjaccengage="{"action":"secondClick","actionType":"FANTOMAS","varName":"pjinfosaccengage-rmk-connexefd-fcp06891649prospect000001c0001"}" href="/pros/detail?bloc_id=FCP06891649PROSPECT000001C0001&no_sequence=1&code_rubrique=14053800" data-pjstats="{"idTag":"DENOMINATION-EXACTE","pos":3,"type_bi":"pro","genreBloc":"1","pjscript":"tag.click.send({elem:{},level2:{%xtn2},name:'denom_exacte',chapter1:'LR_BI',chapter2:'zone_identification',chapter3:'info',type:'action',customObject:{idrequete:pjstatVars.idRequete||'',customDim:{typeRecherche:window.typeRecherche||''},bloc_position:0{%pjstats.pos}}});"}">


import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=m%C3%A9tallurgie&ou=Lyon")
elems = driver.find_element(By.XPATH, "//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))
driver.close()

2 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
3 avril 2021 à 17:27
bonjour,
tu n'expliques pas comment se comporte ton programme.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
3 avril 2021 à 17:34
en tous cas, ta ligne 10 me semble très bizarre: connais-tu la différence entre
find_element()
et
find_elements()
?
0
Bonjour yg_be,

Oui ne t'en fais pas je connais la différence, j'ai même réussi à résoudre le problème. Toutefois, j'aurais une autre question a te poser. Dans mon code, j'ai besoin de répeter l'action qui récupère les liens href pour chaque changement de pages. Cependant je galère pour récupérer le nombre de pages. J'ai d'ailleurs essayé la fonction "find_element_by_tag_name" ou encore la fonction "to_left_of", mais aucune n'ont fonctionné.
Et je narrive également pas à faire la boucle en question pour relancer la fonction.
Aurais-tu des solutions ?

Voici le code :

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get('https://www.pagesjaunes.fr/')
inputElems = driver.find_elements( By.ID, "quoiqui" )
for inputElem in inputElems:
  inputElem.send_keys('métallurgie')
  inputElem.send_keys(Keys.ENTER)
time.sleep(4)
inputElemz = driver.find_elements( By.ID, "ou" )
for inputElemt in inputElemz:
  inputElemt.send_keys('Lyon')
  inputElemt.send_keys(Keys.ENTER)
time.sleep(7)
recherche = driver.find_element_by_xpath('//button[@type="submit"]')
recherche.click()
time.sleep(5)
nombre_de_pages = driver.find_element_by_xpath("//strong")
x = nombre_de_pages
#faire une boucle pour répeter le changement de pages
page_suivante = driver.find_element( By.ID, "pagination-next" )
page_suivante.click()
time.sleep(10)
continue_link = driver.find_elements_by_tag_name('a')
elems = driver.find_elements_by_xpath("//*[@href]")
values = [""]
for elem in elems:
    values.append(elem.get_attribute("href"))
print(values)
driver.close()


et le code qui essaye de recupérer le nombre de pages avec l'erreur qu'il renvoie :

driver = webdriver.Firefox()
driver.get("https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=m%C3%A9tallurgie&ou=Lyon")
time.sleep(10)
boutton_suivant = driver.find_element_by_tag_name('a')
boutton_suivant_id = driver.find_element(By.ID, "pagination-next")

nombre_de_pages = driver.find_element(with_tag_name('strong').
                                      to_left_of(boutton_suivant_id))
print(nombre_de_pages)
driver.close()




Traceback (most recent call last):
File "C:/Users/dell/Documents/test2.py", line 26, in <module>
nombre_de_pages = driver.find_element(with_tag_name('strong').
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute
response = self.command_executor.execute(driver_command, params)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 372, in execute
data = utils.dump_json(params)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\utils.py", line 33, in dump_json
return json.dumps(json_struct)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type RelativeBy is not JSON serializable
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
4 avril 2021 à 22:31
qu'appelles-tu un "changement de page"?
pourquoi montres-tu un code complet, et puis quelques lignes de code?
chez moi, le code s'exécute sans erreur.
je me demande si tu as compris à quoi servait find_element().
que penses-tu obtenir en faisant :
nombre_de_pages = driver.find_element
?
0
Enygma > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
Modifié le 5 avril 2021 à 11:40
Effectivement tu a raison le nombre de page n'est pas un élément donc on ne peux l'obtenir avec un
driver.find_element
, a moins que je me trompe.
Mais dans se cas la comment faire ?
Et se que j'entend par "changement de page" c'est
Le passage du site internet (pages d'accueil ou autre) a une autre pages du site (boutique ou autre).
Ex on est sur le site leboncoin dans la catégorie vélo et on arrive en bas de la page et on veux continuer de regarder les annonce donc on clique sur suivant et on arrive sur la page 2.
Voila se que j'appelle "changement de page"
Les lignes de code concerné sont les lignes 7 et 8 du deuxième script que j'ai envoyé.
Et en faisant
nombre_de_pages = driver.find_elements
je pensais obtenir la balise "strong" qui contient le nombre de pages.

J'espère que sa sera pas trop dure à comprendre :)
Cdlt
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476 > Enygma
5 avril 2021 à 13:10
quel est le lien entre les deux codes?
le second code est-il complet?
tu as assez confus: tu montres un code qui analyse les pages jaunes, et tu donnes une explication avec un autre site, le bon coin.
il serait utile que tu donnes un exemple de ce que tu veux récupérer comme information.
si tu veux compter les pages, n'est-ce pas plus simple de compter le nombre de fois que tu as cliqué sur "suivant"?
peut-être:
elspan = driver.find_element(By.ID, "SEL-compteur")
print(elspan.get_attribute("textContent"))

en ajoutant peut-être ceci:
elstrong = elspan.find_element_by_tag_name('strong')
print(elspan.get_attribute("textContent"))
0
Enygma > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
5 avril 2021 à 15:33
Merci du conseil tout fonctionne nickel maintenant !
et non le deuxième code n'est pas complet c'était juste pour faire des tests.
Toutefois serais tu comment faire exectuter a une boucle while des variable et une fonction.
En gros pour que se sois plus compréhensible je voudrais réxecuter le code de la ligne 5 a la ligne 12 avec la boucle while mais je ne sais pas comment faire.

deconte_de_page = 0
while deconte_de_page < nombre_de_page:
  deconte_de_page += 1
#faire une boucle pour répeter le changement de pages
page_suivante = driver.find_element( By.ID, "pagination-next" )
page_suivante.click()
time.sleep(10)
continue_link = driver.find_elements_by_tag_name('a')
elems = driver.find_elements_by_xpath("//*[@href]")
values = [""]
for elem in elems:
    values.append(elem.get_attribute("href"))
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476 > Enygma
5 avril 2021 à 15:46
peut-être ainsi?
decompte_de_page = 0
values = [""]
while decompte_de_page < nombre_de_page:
    decompte_de_page += 1
    #faire une boucle pour répeter le changement de pages
    page_suivante = driver.find_element_by_id("pagination-next")
    page_suivante.click()
    time.sleep(10)
    continue_link = driver.find_elements_by_tag_name('a')
    elems = driver.find_elements_by_xpath("//*[@href]")
    for elem in elems:
        values.append(elem.get_attribute("href"))
0