Obtenir des éléments spécifiques dans le sélénium

Sep 26 2020

J'essaye d'obtenir les éléments affichés comme N06D-X N07X R01A-C01 S01G-X01 dans l'image suivante:

Maintenant, j'ai quelque chose comme le WebDriver de cette façon:

who = driver.find_element_by_tag_name("span").find_elements_by_tag_name("p")

et obtenez une sortie comme celle-ci:

[<selenium.webdriver.remote.webelement.WebElement (session="1c044455cf883fdedf6845bcd456bfab", element="0.23338884730774767-2")>]

Je travaille sur Mac Catalina et quand je tape: who.text, il renvoie une liste vide pour une raison quelconque. J'ai eu des problèmes assez similaires avec Bs mais je les ai résolus avec .stringplutôt que .text. Ici .stringne fonctionne pas sur les éléments WebDriver.

La question est: comment puis-je obtenir les articles N06D et ainsi de suite avec du sélénium?

Réponses

1 DebanjanB Sep 26 2020 at 04:48

Il semble que vous étiez assez proche.

[<selenium.webdriver.remote.webelement.WebElement (session="1c044455cf883fdedf6845bcd456bfab", element="0.23338884730774767-2")>]

représente l'élément où vous recherchiez le texte dans l'élément.

Pour extraire les textes, par exemple N06D-X , N07X , etc. de toutes les <p>balises utilisant Selenium et python, vous devez induire WebDriverWait pour visibility_of_all_elements_located()et vous pouvez utiliser l'une des stratégies de localisation suivantes :

  • Utilisation CSS_SELECTORet get_attribute("innerHTML"):

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "li.data-list__property#who-atc-codes span.data-list__property-value p")))])
    
  • Utilisation XPATHet attribut de texte :

    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//li[@class='data-list__property' and @id='who-atc-codes']//span[@class='data-list__property-value']//p")))])
    
  • Remarque : vous devez ajouter les importations suivantes:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Outro

Lien vers la documentation utile:

  • get_attribute() méthode Gets the given attribute or property of the element.
  • text retour d'attribut The text of the element.
  • Différence entre texte et innerHTML en utilisant Selenium
1 woblob Sep 26 2020 at 00:05

vous ne recherchez pas dans tout le site Web mais dans un objet précédemment trouvé

li_object = driver.find_elements_by_id('who-atc-codes')
lst = li_object.find_element_by_tag_name("span").find_elements_by_tag_name("p")

for p in lst:
    print(p.text)
    print(p.get_attribute('innerHTML'))

ou tu peux essayer

span_object = li_object.find_element_by_tag_name("span")
print(span_object.get_attribute('innerHTML'))
1 KunduK Sep 26 2020 at 01:05

Utilisez ce qui suit css selectorpour obtenir la liste des éléments, puis effectuez une itération.

Pour obtenir le texte Vous pouvez utiliser .textou .get_attribute("innterHTML")ou.get_attribute("textContent")

Code:

items=driver.find_elements_by_css_selector("span.data-list__property-value>p")
for item in items:
    print(item.text)
    print(item.get_attribute("innterHTML"))
    print(item.get_attribute("textContent"))
    #To get only value from string use spilt and take the first element.
    print(item.text.strip().split(" ")[0])
    print(item.get_attribute("innterHTML").strip().split(" ")[0])
    print(item.get_attribute("textContent").strip().split(" ")[0])