code: def _parse_table(
      self,
      content: str,
      add_date: pd.DataFrame,
      remove_date: pd.DataFrame,
  ) -> pd.DataFrame:
      df = pd.DataFrame()
      _tmp_count = 0
      for _df in pd.read_html(content):
          if _df.shape[-1] != 4 or _df.isnull().loc(0)[0][0]:
              continue
          _tmp_count += 1
          if self.html_table_index + 1 > _tmp_count:
              continue
          tmp = []
          for _s, _type, _date in [
              (_df.iloc[2:, 0], self.REMOVE, remove_date),
              (_df.iloc[2:, 2], self.ADD, add_date),
          ]:
              _tmp_df = pd.DataFrame()
              _tmp_df[self.SYMBOL_FIELD_NAME] = _s.map(
                  self.normalize_symbol
              )
              _tmp_df["type"] = _type
              _tmp_df[self.DATE_FIELD_NAME] = _date
              tmp.append(_tmp_df)
          df = pd.concat(tmp)
          df.to_csv(
              str(
                  self.cache_dir.joinpath(
                      f"{self.index_name.lower()}_changes_{add_date.strftime('%Y%m%d')}.csv"
                  ).resolve()
              )
          )
          break
      return df
  
imports: import re
  import abc
  import sys
  from io import BytesIO
  from typing import List, Iterable
  from pathlib import Path
  import fire
  import requests
  import pandas
  import baostock
  from tqdm import tqdm
  from loguru import logger
  from data_collector.index import IndexBase
  from data_collector.utils import get_calendar_list, get_trading_date_by_shift, deco_retry
  from data_collector.utils import get_instruments
label_desc: Use image node_id 11 for calling the CSIIndex obj's underlying member method code with example usage: obj._parse_table(content, add_date, remove_date) and returns: df