朱健勇(小组:李禹含、陈智诚、朱健勇)的作业二

作业二代码


  from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.common.keys import Keys
  import re
  import pandas as pd
  #导入模块

  browser = webdriver.Edge()
  browser.get('https://www.szse.cn/disclosure/listed/fixed/index.html')
  element = browser.find_element(By.ID, 'input_code')
  element.send_keys('漫步者' + Keys.RETURN)
  #打开浏览器找到目标股票公告结果

  element = browser.find_element(By.ID, 'disclosure-table')
  innerHTML = element.get_attribute('innerHTML')
  #找到表格行的开始和结束标签之间的HTML

  f = open('innerHTML-漫步者.html', 'w', encoding = 'utf-8')
  f.write(innerHTML)
  f.close()
  #建立一个html文件,写入innerHTML的内容

  browser.quit()

  class DisclosureTable():
  #定义一个命名为DisclosureTable的类
      '''
      解析深交所定期报告页搜索表格
      '''
      def __init__(self, innerHTML):
          self.html = innerHTML
          self.prefix = 'https://disc.szse.cn/download'
          #给形式参数self增加变量,并赋值

          p_a = re.compile('(.*?)', re.DOTALL)
          p_span = re.compile('(.*?)', re.DOTALL)
          #编译匹配规则,换行符也同样适用

          self.get_code = lambda txt: p_a.search(txt).group(1).strip()
          self.get_time = lambda txt: p_span.search(txt).group(1).strip()
          #使用lambda直接匹配txt中的内容得到股票代码和公告时间,并去除首尾的空字符
          self.txt_to_df()

      def txt_to_df(self):
          # html table text to DataFrame
          html = self.html
          p = re.compile('(.*?)', re.DOTALL)
          trs = p.findall(html)
          #查找html中每一行表格的内容

          p2 = re.compile('(.*?)', re.DOTALL)
          tds = [p2.findall(tr) for tr in trs[1:]]
          #循环查找输出一个列表包含每一行各个表格的数据

          df = pd.DataFrame({'证券代码': [td[0] for td in tds],
                             '简称': [td[1] for td in tds],
                             '公告标题': [td[2] for td in tds],
                             '公告时间': [td[3] for td in tds]})
          #建立一个数据框架,将tds中的内容依次填入
          self.df_txt = df

      def get_link(self, txt):
          p_txt = '(.*?)'
          p = re.compile(p_txt, re.DOTALL)
          #编译匹配规则

          matchObj = p.search(txt)
          attachpath = matchObj.group(1).strip()
          href       = matchObj.group(2).strip()
          title      = matchObj.group(3).strip()
          return([attachpath, href, title])
          #查找匹配输出结果

      def get_data(self):
          get_code = self.get_code
          get_time = self.get_time
          get_link = self.get_link
          df = self.df_txt
          # 赋值

          codes = [get_code(td) for td in df['证券代码']]
          short_names = [get_code(td) for td in df['简称']]
          ahts = [get_link(td) for td in df['公告标题']]
          times = [get_time(td) for td in df['公告时间']]
          #建立表格

          prefix = self.prefix
          prefix_href = self.prefix
          df = pd.DataFrame({'证券代码': codes,
                             '简称': short_names,
                             '公告标题': [aht[2] for aht in ahts],
                             'attachpath': [prefix + aht[0] for aht in ahts],
                             'href': [prefix_href + aht[1] for aht in ahts],
                             '公告时间': times
              })
          #建立一个数据框架命名为df
          return(df)

  f = open('innerHTML-漫步者.html', encoding = 'utf-8')
  html = f.read()
  f.close()
  #将innerHTML-漫步者.html的内容读入html

  dt = DisclosureTable(html)
  df = dt.get_data()
  df.to_csv('data-漫步者.csv')
  #对html使用DisclosureTable中的属性和方法,并将结果导出为csv文件

作业二结果

结果截图 结果截图

解释

1、用代码控制浏览器找到目标股票公告披露网页; 2、提取网页中的信息披露结果; 3、匹配查找所需要的内容; 4、输出结果。