当然SBI証券のページ構成が変わったら使えなくなります。
import csv import requests from bs4 import BeautifulSoup import pandas as pd url = "https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html" response = requests.get(url) response.encoding = response.apparent_encoding #エンコーディング指定。これないと日本語文字列が文字化けする soup = BeautifulSoup(response.text, "html.parser") # テーブルから必要な列(ティッカー)を抽出 stock_tickers = [] etf_tickers = [] adr_tickers = [] with open("tickers.csv", "w", newline="") as csvfile: writer = csv.writer(csvfile) tables = soup.find_all("table", class_="md-l-table-01") #普通株式 収集 table = tables[0] df = pd.read_html(str(table))[0] if 'ティッカー' in df.columns: # ティッカー列がある場合 stock_tickers += df['ティッカー'].tolist() #ETF 収集 table = tables[1] df = pd.read_html(str(table))[0] if 'ティッカー' in df.columns: # ティッカー列がある場合 etf_tickers += df['ティッカー'].tolist() #CSV出力 for ticker in stock_tickers: writer.writerow([ticker, "stock"]) for ticker in etf_tickers: writer.writerow([ticker, "etf"]) #ADR 収集 tables = soup.find_all("table", summary="layout" ) for table in tables: df = pd.read_html(str(table))[0] if 'ティッカー' in df.columns: # ティッカー列がある場合 adr_tickers += df['ティッカー'].tolist() #CSV出力 for ticker in adr_tickers: writer.writerow([ticker, "adr"])