如何修改Selenium代码切换表格季度视图至Q4 2021 13F Filings
解决方案
要实现将“Quarter View”切换为“Q4 2021 13F Filings”并抓取对应表格,你需要在页面加载后添加季度选择的操作步骤,同时优化原代码的浏览器实例创建逻辑(避免重复打开浏览器)。以下是修改后的完整代码及说明:
修改后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC import pandas as pd test = {} dict_scr = {} # 初始化浏览器实例(仅创建一次,提升效率) options = webdriver.FirefoxOptions() options.binary_location = r'C://Local/Mozilla Firefox/firefox.exe' driver = webdriver.Firefox(executable_path='C:/geckodriver.exe', options=options) try: for ii in range(0, 12): url = link_scr['Links'][ii] driver.get(url) # 等待季度选择下拉框加载完成 quarter_select = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "quarter_select")) ) # 选择目标季度:Q4 2021 13F Filings select = Select(quarter_select) # 方式1:通过可见文本选择(直观易读) select.select_by_visible_text("Q4 2021 13F Filings") # 方式2:通过选项value选择(更稳定,示例网站中该选项value为"1640995200") # select.select_by_value("1640995200") # 等待表格更新(切换季度后表格会重新加载,必须等待新数据渲染完成) target_table = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table#current_holdings_table")) ) # 抓取表格HTML并解析为DataFrame test[link_scr.index[ii]] = target_table.get_attribute("outerHTML") dict_scr[link_scr.index[ii]] = pd.read_html(test[link_scr.index[ii]]) print(test[link_scr.index[ii]]) finally: # 循环结束后关闭浏览器,释放资源 driver.quit()
关键修改点说明
- 复用浏览器实例:将浏览器初始化代码移到循环外,避免每次循环打开新窗口,大幅提升运行效率。
- 季度选择逻辑:
- 目标网站的季度选择控件是原生
<select>元素(ID为quarter_select),因此可以直接使用Selenium的Select类进行操作。 - 提供两种选择方式:通过可见文本或选项value,可根据稳定性需求选择。
- 目标网站的季度选择控件是原生
- 等待表格更新:切换季度后页面会异步加载新表格数据,必须重新等待表格元素加载完成,确保抓取的是目标季度的数据。
- 路径修正:修正了
geckodriver.exe路径的转义问题,避免运行报错。
备用方案(若原生select不可用)
如果网站后续修改了控件结构(改用自定义下拉而非原生select),可替换季度选择部分的代码为:
# 点击下拉按钮触发选项列表 dropdown_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "div.selectize-input")) ) dropdown_btn.click() # 点击目标季度选项 target_option = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'selectize-dropdown')]//div[text()='Q4 2021 13F Filings']")) ) target_option.click()
内容的提问来源于stack exchange,提问作者Agustos Imola
相关产品推荐
相关产品推荐

