Selenium Python для l oop получает только первый предмет - PullRequest
1 голос
/ 25 января 2020

Мой для l oop, кажется, только находит первый элемент из 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

, который дал тот же результат.

Ответы [ 2 ]

3 голосов
/ 25 января 2020

Вам нужно исправить с 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)
1 голос
/ 25 января 2020

Хотя кажется, что вы уже определили явное ожидание, вы использовали жестко заданную задержку, от которой вы можете избавиться, чтобы сделать скрипт устойчивым. Вот еще один способ сделать то же самое с помощью селектора 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...