Localiser un élement avec sélenium

Résolu
Enygma -  
 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()
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 583
 
bonjour,
tu n'expliques pas comment se comporte ton programme.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
en tous cas, ta ligne 10 me semble très bizarre: connais-tu la différence entre
find_element()
et
find_elements()
?
0
Enygma
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583 > Enygma
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 583 > 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"))
0