Obtenir des éléments spécifiques dans le sélénium
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
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_SELECTORetget_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
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'))
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])