[英]Selenium Python for loop only gets first item
我的 for 循环似乎只能从https://public.tableau.com/en-gb/gallery/?tab=viz-of-the-day&type=viz-of-the-day 中找到第一项而不是循环所有日期和标题。 如果我print(viz)
我可以看到不同的元素,但这似乎没有被执行。
driver.get("https://public.tableau.com/en-gb/gallery/?tab=viz-of-the-day&type=viz-of-the-day")
wait = WebDriverWait(driver, 10)
time.sleep(10)
vizzes = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".gallery-items-list div.gallery-list-item-container")))
for viz in vizzes:
print(viz)
#publish date
date_id = driver.find_element_by_css_selector('[data-test-id="published-date"]').text
print(date_id)
#name of the viz
viz_name = driver.find_element_by_xpath("//a[contains(@href, '/en-gb/gallery/')]").text
print(viz_name)
对于 xpath 我尝试使用
viz_name = driver.find_element_by_xpath(".//a[contains(@href, '/en-gb/gallery/')]").text
和
viz_name = driver.find_element_by_xpath("//*[contains(@href, '/en-gb/gallery/')]").text
这产生了相同的结果。
您需要使用viz.find_element..
而不是driver.find_element..
进行更正:
#publish date
date_id = viz.find_element_by_css_selector('[data-test-id="published-date"]').text
print(date_id)
#name of the viz
viz_name = viz.find_element_by_xpath("//a[contains(@href, '/en-gb/gallery/')]").text
print(viz_name)
尽管您似乎已经定义了显式等待,但您使用了硬编码延迟,您可以摆脱它以使脚本健壮。 这是使用 css 选择器执行相同操作的另一种方法:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
link = "https://public.tableau.com/en-gb/gallery/?tab=viz-of-the-day&type=viz-of-the-day"
with webdriver.Chrome() as driver:
wait = WebDriverWait(driver, 10)
driver.get(link)
for item in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "[class$='item-container']"))):
viz_name = item.find_element_by_css_selector("[class$='item-title-left'] > a").text
date_id = item.find_element_by_css_selector("[data-test-id='published-date']").text
print(viz_name,date_id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.