Localiser un élement avec sélenium [Résolu]

Signaler
-
 Enygma -
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

Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
bonjour,
tu n'expliques pas comment se comporte ton programme.
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
en tous cas, ta ligne 10 me semble très bizarre: connais-tu la différence entre
find_element()
et
find_elements()
?
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
>
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021

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"))
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827 > Enygma
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"))
>
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021

Pas bête :)
Et nickel ça marche super !
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827 > Enygma
peux-tu alors marquer la discussion comme résolue?
>
Messages postés
15020
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021

Oui bien sûr