![見出し画像](https://assets.st-note.com/production/uploads/images/81955331/rectangle_large_type_2_9bfd517fd9e158ea0222ea5ba73d43c2.jpeg?width=1200)
Python始めました。Webの表を一発で取得
いまにゅ先生のプログラミング塾
「【番外編】スクレイピングせずにWebページ上の表データを一瞬で取得する方法をわかりやすく解説!」を自分でもコードを書いてみることにしました。
先生の動画(6:40) の yahoo の表が変わっています!!!
'名称・コード・市場'が1つの文字列に・・・・
更に、
’取引値'は、'取引値','取引日'に、’前日比'は'前日比(円)','前日比(%)'
頭が真っ白になりました。@@;
![](https://assets.st-note.com/img/1656849645558-wOcePuWOpF.png?width=1200)
Google先生に聞きまくって、ようやく自分なりの答えが出ました。
まずは、文字列の分割
① ['名称・コード・市場'] と ['前日比'] の 分割方法
正規表現 (reモジュール)を使用
② ['取引値'] の 分割方法
桁数で分割( pandasの文字列の列にスライスを適用 )
次に、列データの一括処理
分割したい列をpandas の applyで関数を作成呼び出し、複数の値を返すようにしました。(表現、合ってるかな?・・・汗)
出来たコード(とりあえず動いた)
import pandas as pd
import re # 正規表現 (reモジュール)
def mks_re(x): # '名称・コード・市場' を分割
mks_d=re.search(r'[0-9]{4}',x) # 4桁の数字(コード)の位置を抽出
dks_c = mks_d.group() # コード
dks_m = x[0:mks_d.start()] # 名称
dks_s = x[mks_d.end():-3] # 市場 = 3文字マイナス「掲示板」
return pd.Series([dks_m,dks_c,dks_s])
def tohi_re(x): # '取引値' を取引値・月日に分割
tori_bi = x[-5:]
tori_ti = x[:-5]
return pd.Series([tori_ti,tori_bi])
def zen_hi(x): # '前日比' を、円・%に分割
zen_hi =re.search(r'[+-]',x[1:]) # x[1:] 2文字目からサーチ
en = x[0:zen_hi.start()+1]
pa = x[zen_hi.start()+1:]
return pd.Series([en,pa])
def bunkatu():
df[['名称','コード','市場']] = df['名称・コード・市場'].apply(mks_re)
df[['取引値','取引日']] = df['取引値'].apply(tohi_re)
df[['前日比(円)','前日比(%)']] = df['前日比'].apply(zen_hi)
url_u = 'https://finance.yahoo.co.jp/stocks/ranking/up?market=all&term=daily'
dfs = pd.read_html(url_u)
print(len(dfs)) # テーブルの数を確認
df = dfs[0] # 1つ目のテーブルを取得
bunkatu() # 繋がった文字列を分割
dfw = df.reindex(columns = ['順位', '名称','コード','市場', '取引値','取引日', '前日比(円)','前日比(%)', '出来高'])
dfw.to_excel('株価ランキング_値上がり率.xlsx')
出力結果はテキストです。
数値の変換はしていません。
上記のコードは動かなくなったのでブログで記事を書き直しました
おわり
サポートを頂けると、沢山記事が書けると思います。