Python Selenium: получить значения из выпадающего списка

1

Я использую Selenium в Python, чтобы открыть веб-страницу, и я пытаюсь получить список значений из определенного раскрывающегося списка. Скажем, код HTML для раскрывающегося списка выглядит так:

<select class="mdc-select__input" name="nouveau-num" data-msisdn-loaded="0">                           <option value="" selected="selected"></option>
                     <option value="351 8320175">351 8320175</option>
<option value="351 8652736">351 8652736</option>
<option value="351 8783295">351 8783295</option>
<option value="351 8094085">351 8094085</option>
<option value="351 8861691">351 8861691</option>
<option value="351 8271705">351 8271705</option>
<option value="351 8970191">351 8970191</option>
<option value="351 8965848">351 8965848</option>
<option value="351 8353924">351 8353924</option>
<option value="351 8988158">351 8988158</option>
</select>

И я хочу получить все значения между тегами <option>. Я попытался сделать browser.page_source который возвращает HTML-источник веб-страницы, а затем выполняет регулярное выражение (что-то вроде <option value="[0-9 ]*">), но результат пуст. По какой-то причине, однако, код HTML выше не находится в исходном коде HTML-страницы, полученном Selenium. Любые идеи, как я могу подойти к этому по-другому/что не так с нынешним подходом?

Теги:
selenium

2 ответа

0
Лучший ответ

Вы можете создать объект Select и перебрать количество опций с помощью цикла.

Например:

from selenium.webdriver.support.ui import Select
selector = Select(driver.find_element_by_name("nouveau-num"))
options = selector.options
for index in range(0, len(options)-1):
    print(options[index])

Редактировать:

Я попробовал код на ссылку, которую вы предоставили, и кажется, что существует задержка до тех пор, пока не будут загружены значения выпадающего списка. Кроме того, я забыл, что параметры имеют список элементов, поэтому вам нужно указать.text. Кроме того, что By.NAME работает лучше, чем find_element_by_name

Вот скорректированный код:

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

dropdown = driver.find_element(By.NAME, "nouveau-num")

selector = Select(dropdown)

# Waiting for the values to load
element = WebDriverWait(driver, 
10).until(EC.element_to_be_selected(selector.options[0]))

options = selector.options
for index in range(1, len(options)-1):
    print(options[index].text)

Используя этот код, я получаю следующие результаты:

351 8631174
351 8586821
351 8014561
351 8831839
351 8957001
351 8673968
351 8612034
351 8585995
351 8438130
  • 0
    Я пробовал это, но по какой-то причине это не работает. Я использую веб-сайт registrazione.iliad.it, и сначала я нажимаю переключатель «нет», после чего появляется выпадающее меню, из которого я хочу извлечь значения.
  • 0
    Я обновил свой ответ.
1

Согласно этому блестящему ответу, синтаксический анализ HTML с помощью Regex никогда не является хорошей идеей.

Вам лучше использовать find_elements_by_css_selector или find_elements_by_xpath.

Пример с селекторами css:

for tag in browser.find_elements_by_css_selector('select[name=nouveau-num] option'):
    value = tag.get_attribute('value')
    text = tag.text
  • 0
    Я пробовал это, но по какой-то причине это не работает. Я использую веб-сайт registrazione.iliad.it, и сначала я нажимаю переключатель «нет», после чего появляется выпадающее меню, из которого я хочу извлечь значения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню