Я пытаюсь получить доступ к значениям обоих полей Year и Quarter с этого конкретного сайта. С помощью одного из членов StackOverflow я смог реализовать код для части year, теперь, если я хочу получить доступ к части quarter, как я могу получить к ней доступ.

Ниже представлена ​​реализация на данный момент.

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

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-error')
options.add_argument('--ignore-ssl-errors')

url = "https://lifeinsurance.adityabirlacapital.com/about-us/public-disclosure"
driver = webdriver.Chrome(executable_path='drivers/chromedriver.exe')

driver.get(url)

WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "div.selectize-input.items.full.has-options.has-items"))
).click()

year_dropdown = WebDriverWait(driver, 20).until(
    EC.visibility_of_all_elements_located(
        (By.CSS_SELECTOR, "div.selectize-dropdown-content div.option")
    )
)

for year in year_dropdown:
    print(year.text)

Любые подсказки и предложения приветствуются.

0
Shaikh Abuzar 11 Фев 2021 в 23:15

2 ответа

Лучший ответ

У вас одинаковая структура как по годам, так и по кварталам. Один с selectPublicYear, а другой с классом selectPublicQuarter

wait = WebDriverWait(driver, 20)

# Years
year_selector = ".selectize-control.selectPublicYear"
year_option_selector = year_selector + " .option"

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year_selector))).click()

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year_option_selector)))
years = driver.find_elements(By.CSS_SELECTOR, year_option_selector)
for year in years:
    print(year.text)
years[-1].click()

# Quarters
quarter_selector = ".selectize-control.selectPublicQuarter"
quarter_option_selector = quarter_selector + " .option"

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, quarter_selector))).click()
# Wait for option element to be clickable.
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, quarter_option_selector)))
# Get all option elements
quarters = driver.find_elements(By.CSS_SELECTOR, quarter_option_selector)
for quarter in quarters:
    print(quarter.text)
# Select last one
quarters[-1].click()

Вы можете добавить метод выбора раскрывающегося списка по значению:

def select_dropdown(name, selector, value):
    print(f'Select "{name}" dropdown, value: "{value}"')

    # Selectors
    selector = ".selectize-control" + selector
    option_selector = selector + " .option"

    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector))).click()

    # Wait for option element to be clickable
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, option_selector)))

    # Get all options elements
    option_elements = driver.find_elements(By.CSS_SELECTOR, option_selector)
    # Get text values from options
    options = [opt.text.strip() for opt in option_elements]
    print(f'Available values: {options}')

    # Check if options have value
    if value not in options:
        raise Exception(f'"{name}" dropdown does not have "{value}" value. Available values: {options}')

    option_elements[options.index(value)].click()

Метод вызова:

select_dropdown(name="Year", selector=".selectPublicYear", value="2020-2021")
select_dropdown(name="Quarter", selector=".selectPublicQuarter", value="Q2: Sep, 2020")
1
Sers 12 Фев 2021 в 07:24

Чтобы извлечь тексты, например Q4: март 2021 г. , из всех <class="option"> с использованием Selenium и , вам необходимо вызвать WebDriverWait для {{X1 }}, и вы можете использовать любую из следующих стратегий поиска :

  • Использование XPATH:

    driver.get('https://lifeinsurance.adityabirlacapital.com/about-us/public-disclosure')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[text()='Quarter']//following::div[@class='selectize-input items full has-options has-items']"))).click()
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='selectize-dropdown-content']//div[contains(@class, 'option')]")))])
    
  • Консольный вывод:

    ['All Quarters', 'Q4: Mar, 2021', 'Q3: Dec, 2020', 'Q2: Sep, 2020', 'Q1: Jun, 2020']
    
  • Примечание . Вам необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0
DebanjanB 12 Фев 2021 в 07:38
66162139