You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:27:25