Python Selenium查找含指定编号460的招股说明书页面问题
DART招股说明书检索网站定位指定编号文件实现方案
核心需求逻辑
- 首先筛选标题包含
투자설명서(招股说明书)的页面,每份招股说明书主页面顶部会标注对应交易序列号 - 逐页校验打开的招股说明书序列号是否为460:当前检索到的最新页面序列号为461不符合要求,需关闭不符合的页面、自动翻页持续检索,直到定位到序列号为460的目标页
- 现有代码缺失自动翻页持续检索的逻辑,无法完成跨页遍历
现有测试代码
url = 'https://dart.fss.or.kr/dsab007/main.do?option=corp' driver.get(url) cpny_name_input = driver.find_element_by_id("textCrpNm") cpny_name_input.clear() cpny_name_input.send_keys("롯데카드") driver.find_element_by_xpath('//*[@id="searchForm"]/div[1]/div/ul/li/div[3]/a').click() time.sleep(5) driver.find_element_by_xpath('//*[@id="searchForm"]/div[1]/div/ul/li/div[3]/a').click() time.sleep(3) main_window = driver.current_window_handle prospectus=driver.find_elements_by_xpath("//a[contains(text(),'투자설명서')]") #contains 'prospetus' time.sleep(3) found_p = False for p in prospectus: p.click() main =driver.find_elements_by_id("ifrm") re =driver.window_handles[1] driver.switch_to.window(re) side_panel = driver.find_elements_by_class_name("leftPanelWrap") while len(side_panel) == 0: driver.refresh() side_panel = driver.find_elements_by_class_name("leftPanelWrap") main_info_pages = driver.find_elements_by_partial_link_text("모집 또는 매출에 관한 일반사항") if len(main_info_pages) == 0: driver.close() driver.switch_to.window(main_window) continue else: try: main_info_pages[0].click() except: return None time.sleep(3) iframes = driver.find_elements_by_id("ifrm") if len(iframes) > 0: iframe = iframes[0] driver.switch_to.frame(iframe) source = driver.page_source if '460' in source: found_p = True print("Found prospectus with 460") break
当前已知信息:搜索结果顶部第一条招股说明书链接为
https://dart.fss.or.kr/dsaf001/main.do?rcpNo=20220627000389,其顶部标注的序列号为461,不符合检索要求。
修复方案
现有代码缺陷
- 仅遍历了搜索结果第一页的招股说明书链接,没有添加跨页翻页逻辑,无法遍历后续页面的内容
- 窗口、iframe切换后没有重置驱动上下文,多次循环后容易出现元素定位失败的问题
- 序列号匹配逻辑过于粗糙,直接检索页面源码中的
460字符串容易误匹配其他位置出现的相同数字串
修复后完整代码
核心补充了外层翻页循环、上下文重置逻辑、精确序列号匹配逻辑:
import time from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException url = 'https://dart.fss.or.kr/dsab007/main.do?option=corp' driver.get(url) # 输入公司名搜索 cpny_name_input = driver.find_element(By.ID, "textCrpNm") cpny_name_input.clear() cpny_name_input.send_keys("롯데카드") # 触发搜索 search_btn = driver.find_element(By.XPATH, '//*[@id="searchForm"]/div[1]/div/ul/li/div[3]/a') search_btn.click() time.sleep(5) search_btn.click() time.sleep(3) main_window = driver.current_window_handle found_p = False target_serial = "460" while not found_p: # 切回主页面默认上下文,避免iframe残留影响 driver.switch_to.window(main_window) driver.switch_to.default_content() # 获取当前页所有招股说明书链接 prospectus_list = driver.find_elements(By.XPATH, "//a[contains(text(),'투자설명서')]") for p in prospectus_list: p.click() time.sleep(2) # 切换到新打开的招股书窗口 doc_window = [w for w in driver.window_handles if w != main_window][0] driver.switch_to.window(doc_window) # 等待左侧面板加载 side_panel = driver.find_elements(By.CLASS_NAME, "leftPanelWrap") while len(side_panel) == 0: driver.refresh() time.sleep(2) side_panel = driver.find_elements(By.CLASS_NAME, "leftPanelWrap") # 打开募集通用事项页 main_info_entry = driver.find_elements(By.PARTIAL_LINK_TEXT, "모집 또는 매출에 관한 일반사항") if len(main_info_entry) == 0: driver.close() continue try: main_info_entry[0].click() except: driver.close() continue time.sleep(3) # 切换到内容iframe driver.switch_to.default_content() content_iframe = driver.find_elements(By.ID, "ifrm") if len(content_iframe) > 0: driver.switch_to.frame(content_iframe[0]) # 精确匹配顶部序列号,避免误匹配 page_source = driver.page_source # 匹配招股书顶部交易序列号位置的460 serial_elements = driver.find_elements(By.XPATH, "//*[contains(text(),'거래일련번호')]/following-sibling::td") serial_match = False if len(serial_elements) >0: serial_text = serial_elements[0].text.strip() if serial_text == target_serial: serial_match = True else: # 兜底用源码匹配,可自行调整匹配规则降低误判 if f"거래일련번호 {target_serial}" in page_source: serial_match = True if serial_match: found_p = True print(f"成功定位序列号为{target_serial}的招股说明书页面,当前窗口句柄:{doc_window}") break # 不符合则关闭当前文档窗口,继续遍历 driver.close() # 当前页遍历完没找到,点击下一页 if not found_p: driver.switch_to.window(main_window) driver.switch_to.default_content() try: next_page_btn = driver.find_element(By.XPATH, "//div[@class='pagination']/a[@class='next']") next_page_btn.click() time.sleep(3) except NoSuchElementException: print("已经遍历所有页面,未找到目标文件") break
关键逻辑说明
- 新增外层
while循环,只要未找到目标文件,就持续遍历当前页内容、自动点击下一页,直到找到目标或遍历完所有页面 - 每次切换窗口前都执行
switch_to.default_content()重置上下文,避免iframe嵌套导致的元素定位失败 - 优化序列号匹配逻辑,优先定位
거래일련번호(交易序列号)对应字段的文本做精确匹配,避免页面其他位置出现460字符串导致误判 - 修复了旧版selenium API(
find_element_by_*)的兼容问题,使用官方推荐的By类定位元素,适配更高版本的selenium库
内容的提问来源于stack exchange,提问作者Joyce
相关产品推荐
相关产品推荐

