15

我有以下 HTML 代码

<select name="countries" class_id="countries">
    <option value="-1">--SELECT COUNTRY--</option>
    <option value="459">New Zealand</option>
    <option value="100">USA</option>
    <option value="300">UK</option>
</select>

我正在尝试使用 Selenium 获取选项值列表(如 459、100 等,而不是文本)。

目前我有以下Python代码

from selenium import webdriver

def country_values(website_url):
    browser = webdriver.Firefox()
    browser.get(website_url)
    html_code=browser.find_elements_by_xpath("//select[@name='countries']")[0].get_attribute("innerHTML")
    return html_code

如您所见,代码返回纯 HTML,我正在使用 HTMLParser 库对其进行解析。有没有办法只使用 Selenium 来获取选项值?换句话说,无需解析 Selenium 的结果?

4

4 回答 4

31

看看,在我知道选择模块做了什么之前,我是这样做的

from selenium import webdriver

browser = webdriver.Firefox()
#code to get you to the page

select_box = browser.find_element_by_name("countries") 
# if your select_box has a name.. why use xpath?..... 
# this step could use either xpath or name, but name is sooo much easier.

options = [x for x in select_box.find_elements_by_tag_name("option")]
# this part is cool, because it searches the elements contained inside of select_box 
# and then adds them to the list options if they have the tag name "options"

for element in options:
    print(element.get_attribute("value"))
    # or append to list or whatever you want here

像这样的输出

-1
459
100
300
于 2013-08-29T16:20:20.690 回答
12
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as UI
import contextlib

with contextlib.closing(webdriver.Firefox()) as driver:
    driver.get(url)
    select = UI.Select(driver.find_element_by_xpath('//select[@name="countries"]'))
    for option in select.options:
        print(option.text, option.get_attribute('value'))  

印刷

(u'--SELECT COUNTRY--', u'-1')
(u'New Zealand', u'459')
(u'USA', u'100')
(u'UK', u'300')

我在这里学到了这一点。另请参阅文档

于 2013-08-29T16:17:20.543 回答
8

更简单的版本:

from selenium.webdriver.support.ui import Select 

dropdown_menu = Select(driver.find_element_by_name(<NAME>))
   
for option in dropdown_menu.options:
            print(option.text, option.get_attribute('value'))
于 2017-08-26T08:16:40.407 回答
0

稍微改进的答案。在 Selenium 和 Python 中,如果要获取所有属性值,请使用以下列表推导:

options = [x.get_attribute("value") for x in driver.find_element_by_id("yourlocator").find_elements_by_tag_name("option")]
print(options)

简单的调用.text不适用于列表。采用:

options = [x.get_attribute("innerText") for x in driver.find_element_by_id("yourlocator").find_elements_by_tag_name("option")]
print(options)
于 2021-03-08T16:49:54.760 回答