yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。
20210320_pandas_lxml

結局Webページの表の中のデータを取得するのはpandasとlxmlどっちがいいの?

2021-03-21

結局Webページの表の中のデータを取得するのはPandasとlxmlどっちがいいの?

結果としては、表形式と決まっていればpandas、汎用性があるのはlxmlという所感

今回は、Yahoo!ファイナンスのページの表の特定のデータをpandasとlxmlでそれぞれの方法で取得してみる
参考:Yahoo!ファイナンス

具体的には、「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字を取得する
20210320_pandas_lxml

  1. 事前準備
  2. pandasでWeb上の表の特定のデータを取得する方法
  3. lxmlでWeb上の表の特定のデータを取得する方法

事前準備

Webページの情報をcURLで取得する場合は、以下のコマンドである
参考:ChromeでcURLコマンドを簡単に取得する方法メモ

% curl "https://info.finance.yahoo.co.jp/ranking/?kd=1&tm=d&mk=1"

一からPython書くのは面倒なので、以下のサイトでPython化する
参考:Convert curl syntax to Python, Ansible URI, MATLAB, Node.js, R, PHP, Strest, Go, Dart, JSON, Elixir, Rust

変換すると以下のようなコードになる

import requests

params = (
    ('kd', '1'),
    ('tm', 'd'),
    ('mk', '1'),
)

response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)

このコードを元に作成する

Pythonバージョンは以下の通り

% python -V
Python 3.9.1

pandasでWeb上の表の特定のデータを取得する方法

必要モジュールをインストール

% pip install requests
% pip install pandas
% pip freeze
certifi==2020.12.5
chardet==4.0.0
idna==2.10
numpy==1.20.1
pandas==1.2.2
python-dateutil==2.8.1
pytz==2021.1
requests==2.25.1
six==1.15.0
urllib3==1.26.3

一旦以下のコードで全部を取得する
「pd.set_option(‘display.max_columns’, None)」はセルの中身を省略しないようにする設定

% cat pandas_test.py
#/Users/yoshi/.pyenv/shims/python
# coding: utf-8

import requests
import pandas as pd

pd.set_option('display.max_columns', None)

params = (
    ('kd', '1'),
    ('tm', 'd'),
    ('mk', '1'),
)

response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)

htmlData = response

print(pd.read_html(htmlData.text))

pandasを利用するときはlxmlも必要とのことなのでインストールする

% python pandas_test.py
Traceback (most recent call last):
...(略)...
    raise ImportError("lxml not found, please install it")
ImportError: lxml not found, please install it
% pip install lxml

結局必要モジュールはこんな感じ

% pip freeze
certifi==2020.12.5
chardet==4.0.0
idna==2.10
lxml==4.6.2
numpy==1.20.1
pandas==1.2.2
python-dateutil==2.8.1
pytz==2021.1
requests==2.25.1
six==1.15.0
urllib3==1.26.3

取得するとこんな感じになる

% python pandas_test.py
[    順位   コード      市場                        名称    取引値  取引値.1       前日比 前日比.1  \
0    1  1689   東証ETF       WisdomTree 天然ガス上場投信  03/19      2  +100.00%    +1
1    2  7519   東証JQS               五洋インテックス(株)  03/19    168   +42.37%   +50
2    3  6659   東証JQS               (株)メディアリンクス  03/19    638   +21.76%  +114
3    4  4512    東証1部                 わかもと製薬(株)  03/19    654   +18.05%  +100
4    5  4885   東証JQS                 室町ケミカル(株)  03/19   1584   +17.94%  +241
5    6  5610    東証2部                   大和重工(株)  03/19   1038   +16.89%  +150
6    7  1773  東証1部外国                       YTL  03/19     21   +16.67%    +3
7    8  6337   東証JQS                   (株)テセック  03/19   1568   +12.00%  +168
8    9  6982    東証2部                    (株)リード  03/19    785   +11.98%   +84
9   10  4777   東証JQS                    (株)ガーラ  03/19    267   +11.72%   +28
10  11  3856    東証2部               Abalance(株)  03/19   4860   +11.47%  +500
11  12  1574   東証ETF  MAXISトピックスリスクコントロール(10%)  03/19   1680   +10.53%  +160
12  13  8337    東証1部                 (株)千葉興業銀行  03/19    325   +10.17%   +30
13  14  3464    東証1部            プロパティエージェント(株)  03/19   2300   +10.15%  +212
14  15  7060    東証1部                   ギークス(株)  03/19   1768    +9.54%  +154
15  16  7087    東証2部                 (株)ウイルテック  03/19   1080    +9.20%   +91
16  17  2986   東証JQG             (株)LAホールディングス  03/19   1398    +9.05%  +116
17  18  7695    マザーズ                (株)交換できるくん  03/19   4600    +9.00%  +380
18  19  4598    マザーズ       Delta−Fly Pharma(株)  03/19   1371    +8.81%  +111
19  20  2780    東証2部            (株)コメ兵ホールディングス  03/19    960    +8.60%   +76
20  21  4447     福岡Q             (株)ピー・ビーシステムズ  03/19    970    +8.50%   +76
21  22  8844   東証JQS               (株)コスモスイニシア  03/19    466    +8.37%   +36
22  23  7184    東証1部                 (株)富山第一銀行  03/19    355    +8.23%   +27
23  24  8894    東証2部             (株)REVOLUTION  03/19     40    +8.11%    +3
24  25  6074   東証JQS                (株)ジェイエスエス  03/19    574    +8.10%   +43
25  26  8209    東証2部                 (株)フレンドリー  03/19    538    +8.03%   +40
26  27  6969    東証2部                   松尾電機(株)  03/19    623    +7.97%   +46
27  28  5282    東証2部                  ジオスター(株)  03/19    419    +7.71%   +30
28  29  9904    東証2部                    (株)ベリテ  03/19    470    +7.55%   +33
29  30  5690    東証2部            リバーホールディングス(株)  03/19   1089    +7.50%   +76
30  31  3976    マザーズ                   (株)シャノン  03/19   2612    +7.45%  +181
31  32  8537    東証1部                   (株)大光銀行  03/19   1626    +7.33%  +111
32  33  8708    東証1部                   藍澤證券(株)  03/19   1147    +7.30%   +78
33  34  2068   東証ETF  NEXT NOTES 高ベータ30(NR)ETN  03/19  13780    +6.99%  +900
34  35  8360    東証1部                 (株)山梨中央銀行  03/19   1035    +6.92%   +67
35  36  7963   東証JQS                     興研(株)  03/19   2075    +6.90%  +134
36  37  3393    東証1部         スターティアホールディングス(株)  03/19   1288    +6.89%   +83
37  38  8609    東証1部               (株)岡三証券グループ  03/19    499    +6.85%   +32
38  39  8624    東証1部                 いちよし証券(株)  03/19    663    +6.76%   +42
39  40  7150    東証1部                   (株)島根銀行  03/19    765    +6.69%   +48
40  41  8511    東証1部                 日本証券金融(株)  03/19    760    +6.59%   +47
41  42  7462   東証JQS                  ダイヤ通商(株)  03/19   2590    +6.58%  +160
42  43  8562    東証1部                   (株)福島銀行  03/19    310    +6.53%   +19
43  44  3032    名古屋セ                 (株)ゴルフ・ドゥ  03/19    474    +6.52%   +29
44  45  4762    東証1部                (株)エックスネット  03/19   1132    +6.39%   +68
45  46  4554    東証1部                 富士製薬工業(株)  03/19   1418    +6.38%   +85
46  47  8354    東証1部        (株)ふくおかフィナンシャルグループ  03/19   2407    +6.36%  +144
47  48  3377    東証2部             (株)バイク王&カンパニー  03/19    523    +6.30%   +31
48  49  8563    東証1部                   (株)大東銀行  03/19    783    +6.24%   +46
49  50  9880    東証1部                  イノテック(株)  03/19   1417    +6.22%   +83
50  順位   コード      市場                        名称    取引値    取引値       前日比   前日比

         出来高  掲示板
0   10037700  掲示板
1    4188000  掲示板
2    8624800  掲示板
3     173300  掲示板
4    5318300  掲示板
5      13100  掲示板
6    3044000  掲示板
7     115500  掲示板
8     144600  掲示板
9    3967700  掲示板
10    385400  掲示板
11       250  掲示板
12   1499900  掲示板
13    126900  掲示板
14    263800  掲示板
15     58800  掲示板
16    249100  掲示板
17    210000  掲示板
18    333900  掲示板
19    113900  掲示板
20     22400  掲示板
21    134300  掲示板
22    236700  掲示板
23   5041000  掲示板
24     34300  掲示板
25     21600  掲示板
26    800100  掲示板
27    313900  掲示板
28    969700  掲示板
29   1072700  掲示板
30    134500  掲示板
31     17200  掲示板
32    122700  掲示板
33       499  掲示板
34    407700  掲示板
35     74800  掲示板
36    149300  掲示板
37   1599300  掲示板
38    823100  掲示板
39     31400  掲示板
40   1246800  掲示板
41     26200  掲示板
42   1486400  掲示板
43      7600  掲示板
44     58300  掲示板
45    642400  掲示板
46   3238000  掲示板
47    530400  掲示板
48    105800  掲示板
49    606500  掲示板
50       出来高  掲示板  ]

特定のセル(「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字)を取得するには、以下のように書き換える
※一つ目の表の([0])出来高という列の([‘出来高’])一番最初のセル([0])

% cat pandas_test_2.py
#/Users/yoshi/.pyenv/shims/python
# coding: utf-8

import requests
import pandas as pd

pd.set_option('display.max_columns', None)

params = (
    ('kd', '1'),
    ('tm', 'd'),
    ('mk', '1'),
)

response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)

htmlData = response

print(pd.read_html(htmlData.text)[0]['出来高'][0])

うまく取得できた

% python pandas_test_2.py
10037700

lxmlでWeb上の表の特定のデータを取得する方法

必要モジュールのインストール

% pip install requests
% pip install lxml
% pip freeze
certifi==2020.12.5
chardet==4.0.0
idna==2.10
lxml==4.6.2
requests==2.25.1
urllib3==1.26.4

まずは以下のコードで表の全データを取得してみる
テーブルのXPath(’/html/body/div/div[2]/div[3]/div[2]/div[3]/table’)を指定して表示する
参考:xpathをchromeで取得する方法メモ

% cat lxml_test.py
#/Users/yoshi/.pyenv/shims/python
# coding: utf-8

import requests
import lxml.html


params = (
    ('kd', '1'),
    ('tm', 'd'),
    ('mk', '1'),
)

response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)

htmlData = response

xPath = '/html/body/div/div[2]/div[3]/div[2]/div[3]/table'
htmlContents = lxml.html.fromstring(htmlData.content).xpath(xPath)
print(htmlContents[0].text_content())

結果はこんな感じ、まあこれから特定のセルを取得するので見栄えはおいといて、、

% python lxml_test.py



順位コード市場名称取引値前日比出来高掲示板


11689東証ETFWisdomTree 天然ガス上場投信03/192+100.00%+110,037,700掲示板27519東証JQS五洋インテックス(株)03/19168+42.37%+504,188,000掲示板36659東証JQS(株)メディアリンクス03/19638+21.76%+1148,624,800掲示板44512東証1部わかもと製薬(株)03/19654+18.05%+100173,300掲示板54885東証JQS室町ケミカル(株)03/191,584+17.94%+2415,318,300掲示板65610東証2部大和重工(株)03/191,038+16.89%+15013,100掲示板71773東証1部外国YTL03/1921+16.67%+33,044,000掲示板86337東証JQS(株)テセック03/191,568+12.00%+168115,500掲示板96982東証2部(株)リード03/19785+11.98%+84144,600掲示板104777東証JQS(株)ガーラ03/19267+11.72%+283,967,700掲示板113856東証2部Abalance(株)03/194,860+11.47%+500385,400掲示板121574東証ETFMAXISトピックスリスクコントロール(10%)03/191,680+10.53%+160250掲示板138337東証1部(株)千葉興業銀行03/19325+10.17%+301,499,900掲示板143464東証1部プロパティエージェント(株)03/192,300+10.15%+212126,900掲示板157060東証1部ギークス(株)03/191,768+9.54%+154263,800掲示板167087東証2部(株)ウイルテック03/191,080+9.20%+9158,800掲示板172986東証JQG(株)LAホールディングス03/191,398+9.05%+116249,100掲示板187695マザーズ(株)交換できるくん03/194,600+9.00%+380210,000掲示板194598マザーズDelta−Fly Pharma(株)03/191,371+8.81%+111333,900掲示板202780東証2部(株)コメ兵ホールディングス03/19960+8.60%+76113,900掲示板214447福岡Q(株)ピー・ビーシステムズ03/19970+8.50%+7622,400掲示板228844東証JQS(株)コスモスイニシア03/19466+8.37%+36134,300掲示板237184東証1部(株)富山第一銀行03/19355+8.23%+27236,700掲示板248894東証2部(株)REVOLUTION03/1940+8.11%+35,041,000掲示板256074東証JQS(株)ジェイエスエス03/19574+8.10%+4334,300掲示板268209東証2部(株)フレンドリー03/19538+8.03%+4021,600掲示板276969東証2部松尾電機(株)03/19623+7.97%+46800,100掲示板285282東証2部ジオスター(株)03/19419+7.71%+30313,900掲示板299904東証2部(株)ベリテ03/19470+7.55%+33969,700掲示板305690東証2部リバーホールディングス(株)03/191,089+7.50%+761,072,700掲示板313976マザーズ(株)シャノン03/192,612+7.45%+181134,500掲示板328537東証1部(株)大光銀行03/191,626+7.33%+11117,200掲示板338708東証1部藍澤證券(株)03/191,147+7.30%+78122,700掲示板342068東証ETFNEXT NOTES 高ベータ30(NR)ETN03/1913,780+6.99%+900499掲示板358360東証1部(株)山梨中央銀行03/191,035+6.92%+67407,700掲示板367963東証JQS興研(株)03/192,075+6.90%+13474,800掲示板373393東証1部スターティアホールディングス(株)03/191,288+6.89%+83149,300掲示板388609東証1部(株)岡三証券グループ03/19499+6.85%+321,599,300掲示板398624東証1部いちよし証券(株)03/19663+6.76%+42823,100掲示板407150東証1部(株)島根銀行03/19765+6.69%+4831,400掲示板418511東証1部日本証券金融(株)03/19760+6.59%+471,246,800掲示板427462東証JQSダイヤ通商(株)03/192,590+6.58%+16026,200掲示板438562東証1部(株)福島銀行03/19310+6.53%+191,486,400掲示板443032名古屋セ(株)ゴルフ・ドゥ03/19474+6.52%+297,600掲示板454762東証1部(株)エックスネット03/191,132+6.39%+6858,300掲示板464554東証1部富士製薬工業(株)03/191,418+6.38%+85642,400掲示板478354東証1部(株)ふくおかフィナンシャルグループ03/192,407+6.36%+1443,238,000掲示板483377東証2部(株)バイク王&カンパニー03/19523+6.30%+31530,400掲示板498563東証1部(株)大東銀行03/19783+6.24%+46105,800掲示板509880東証1部イノテック(株)03/191,417+6.22%+83606,500掲示板


順位コード市場名称取引値前日比出来高掲示板

特定のセル(「WisdomTree 天然ガス上場投信」の「出来高」である「10,037,700 」の数字)を取得するには、以下のように書き換える
※xPathの値を表全体ではなくセルにするだけ

 
% cat lxml_test_2.py
#/Users/yoshi/.pyenv/shims/python
# coding: utf-8

import requests
import lxml.html


params = (
    ('kd', '1'),
    ('tm', 'd'),
    ('mk', '1'),
)

response = requests.get('https://info.finance.yahoo.co.jp/ranking/', params=params)

htmlData = response

xPath = '//*[@id="contents-body-bottom"]/div[2]/div[3]/table/tbody/tr[1]/td[9]'
htmlContents = lxml.html.fromstring(htmlData.content).xpath(xPath)
print(htmlContents[0].text_content())

実行結果は以下の通りで、xlmlでも無事に取得できた

% python lxml_test_2.py
10,037,700

以上。