首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Selenium:从下拉列表中获取值

Python Selenium:从下拉列表中获取值
EN

Stack Overflow用户
提问于 2018-06-23 22:01:36
回答 2查看 7.4K关注 0票数 5

我正在使用Python中的Selenium打开一个网页,并试图从一个特定的下拉列表中获取值的列表。假设下拉列表的HTML代码如下所示:

代码语言:javascript
复制
<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>标记之间的所有值。我尝试做一个返回网页HTML源代码的browser.page_source,然后做一个正则表达式(类似于<option value="[0-9 ]*">),但是结果是空的。但是,由于某种原因,上面的HTML代码不在Selenium检索到的HTML页面源代码中。有什么想法可以让我以不同的方式来处理这个问题/当前的方法有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-23 22:48:25

您可以创建一个Select对象并使用循环遍历大量的选项。

例如:

代码语言:javascript
复制
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])

编辑:

我在您提供的链接上尝试了代码,似乎在加载dropdown的值之前会有延迟。此外,我忘记了options有一个元素列表,所以需要指定.text。最重要的是,By.NAME似乎比find_element_by_name工作得更好

以下是更正后的代码:

代码语言:javascript
复制
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)

使用这段代码,我得到了以下结果:

代码语言:javascript
复制
351 8631174
351 8586821
351 8014561
351 8831839
351 8957001
351 8673968
351 8612034
351 8585995
351 8438130
票数 3
EN

Stack Overflow用户

发布于 2018-06-23 22:30:47

根据this brilliant answer的说法,用正则表达式解析HTML从来都不是一个好主意。

你最好使用find_elements_by_css_selectorfind_elements_by_xpath

css选择器示例:

代码语言:javascript
复制
for tag in browser.find_elements_by_css_selector('select[name=nouveau-num] option'):
    value = tag.get_attribute('value')
    text = tag.text
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51001909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档