J'essaie d'explorer les ID de produit dans un site Web, tandis que l'ID se trouve dans le conteneur du produit. Il ne renvoie aucun élément de ce type:
<div data-v-8cd3b522="" na-element="item" na-module="product" na-data="{âids_valueâ:[â#300#â],âids_keyâ:âitem_type_idsâ,âitem_type_idsâ:[â#300#â],âtag_idsâ:[â#85#â],âapp_page_section_idâ:10103,âapp_page_idâ:10011}" class="na finger product-container" na-id="9cd1a902-57aa-48d4-b79c-2bca03d21b83">
HTML:
driver.find_element_by_class_name('na finger product-container')
L'attribut que je voulais récupérer est le ids_value
qui est #300#
dans ce cas.
le site Web: https://www.gratus.com.hk/product/
4 Réponses :
Si vous souhaitez utiliser @class
comme identifiant, essayez de rechercher par nom de classe unique
driver.find_element_by_css_selector('.na.finger.product-container')
ou par sélecteur CSS
driver.find_element_by_class_name('product-container')
Vous devrez peut-être également implémenter une attente implicite / explicite car les données requises semblent dynamiques
peut localiser la division individuelle du produit en utilisant "driver.find_element_by_css_selector ('. na.finger.product-container')", mais comment accéder à {"ids_value": "300"} à l'intérieur du "na-data"?
.get_attribute ('na-data') puis peut-être parser.
driver.find_element_by_css_selector ('. na.finger.product-container'). get_attribute ('na-data')
revenir
{"ids_value": ["# 290 #"], "ids_key": "item_type_ids", "item_type_ids": ["# 290 #"], "tag_ids": ["# 4 #"], "app_page_section_id": 10103 , "app_page_id": 10011}
Merci tout le monde!
Pour analyser la balise.
['#290#']
Les sorties
import json elem=driver.find_element_by_css_selector('.na.finger.product-container').get_attribute('na-data') myJSON = json.loads(elem) print(myJSON["ids_value"])
Pour extraire l' ids_value
par exemple 290 , 291, etc., de tous les <div>
utilisant Selenium et python, vous devez induire WebDriverWait pour la visibility_of_all_elements_located()
et vous pouvez utiliser l'une des stratégies de localisation suivantes:
Utilisation de CSS_SELECTOR
:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Utilisation de XPATH
:
['290', '291', '292', '295', '296', '297', '298', '299', '300', '302', '303', '305', '306', '307', '308', '309']
Sortie de la console:
print([my_elem.get_attribute("na-data").split("#")[1] for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@na-element='item' and @na-module='product']")))])
Remarque : vous devez ajouter les importations suivantes:
print([my_elem.get_attribute("na-data").split("#")[1] for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div[na-element='item'][na-module='product']")))])
Quel attribut voulez
na-id
vousna-id
?l'attribut que je voulais est le "ids_value" qui est "# 300 #" dans le cas
C'est une bonne idée de publier un stackoverflow.com/help/minimal-reproducible-example , afin que les autres utilisateurs puissent coller votre code et répondre rapidement.