[Day 7] 餐前浓汤 pt.4-资料内文取得及储存

上一篇我们提到了如何观察并且取出我们要的资料
也成功地把资料取出来了
这一篇我们将要对资料做最後的加工,把td tag去掉,并且把数据储存下来
废话不多说,咱们累狗~

浓汤的最後步骤-内文取得

经过了好几步骤的层层分析,乙女解剖後
我们终於来到了最後的步骤啦
到底我们要怎麽把td内的资料取出来呢,非常简单
我们把找出来的属性标签後面加上.getText()
就可以取得里面的数据啦
像是我们上一篇找出了tr tag里面有许多td tag
我们可以把所有的td tag内的数据取出来,放进一个list
这样就可以只取出我们要的数据啦

所以这里,我们需要修改我们的for loop程序码
改成如下所示:

for i in tr_tag:
    td_tag = i.find_all("td")
    if len(td_tag) == 3 or len(td_tag) == 5:
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        print(inner)

这里主要修改的就是if condition後的code
假设符合了我们上一篇提到的条件,我们就把所有的td tag内数据取处并存到一个list内
最後我们把他print出来确认结果
於是我们的结果就会变成如下所示

最後,我们再依照网页上面的格式,把它存成一个dict就好了
三格的部分分配是:['会计项目', '金额', '%']
五格部分分配则是:['会计项目', '金额', '预测金额', '年度财务预测达成率%', '截至第2季止财务预测季达成率%']
由於三格跟五格的做法是不一样的,所以我们把if condition给拆开个别做处理
这个部分的code我们就不细讲了,直接上程序码

import requests
import json
from bs4 import BeautifulSoup
url = 'https://mops.twse.com.tw/mops/web/ajax_t163sb01'
data={
        'co_id': '1201',
        'queryName': 'co_id',
        'inputType': 'co_id',
        'isnew': 'true',
        'TYPEK': 'all',
        'encodeURIComponent': '1',
        'step': '1',
        'firstin': '1',
        'off': '1',
        'year': None,
        'season': None
}
headers = {
    #'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
}
res = requests.post(url=url,data=data,headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
tr_tag = soup.find_all("tr", {"class": ["odd", "even"]})
data_table = {} #公司财务报表
balance_sheet = {} #负债表
income_statement = {} #损益表
for i in tr_tag:
    td_tag = i.find_all("td")
    if len(td_tag) == 3: #三个td tag代表为负债表资料
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        balance_sheet[inner[0]] = {'金额': inner[1], '百分比': inner[2]}
    if len(td_tag) == 5: #五个td tag代表为损益表资料
        inner = []
        for j in td_tag:
            inner.append(j.getText())
        income_statement[inner[0]] = {'金额': inner[1], '预测金额': inner[2], '年度财务预测达成率': inner[3], '截至第2季止财务预测季达成率': inner[4]}
data_table['公司代号'] = 1201
data_table['负债表'] = balance_sheet
data_table['损益表'] = income_statement
print("公司代号: {}".format(data_table['公司代号'])) #format内的大括弧代表输入变数
print("负债表:")
for i in data_table['负债表']:
	print("{} {}".format(i, data_table['负债表'][i]))
print("损益表:")
for i in data_table['损益表']:
	print("{} {}".format(i, data_table['损益表'][i]))

好的一定有人会问,啊你dict key用中文可以喔
当然可以,这就是python的厉害之处
不过接下来上vagrant或aws时可能要调整一下环境,之後我们会再详细讲解
一样我们执行看一下结果

这样我们就把资料完美的捞出来啦~

好的,我们这碗美丽的餐前浓汤经过了四篇总算是喝完了
下一篇我们将会进入全新的章节-django
想知道django是做啥的,跟jungle到底有没有关系
咱们下回分解~


<<:  [ Day 3 ] - 运算式与运算子

>>:  Day 4:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《Vivy -Fluorite Eye's Song》Part 4

Day 06:小孩子才做选择-BootstrapVue 全部引入

本篇开始终於要进入解决需求的前置作业了!首先需要让网站有个基本的置顶导览列,让我们有请 Bootst...

[30天 Vue学好学满 DAY17] Event Bus

Event Bus 前面提到了父子元件透过emit & prop进行参数传递,当树状结构逐渐...

DAY11 - DFS应用

昨天写了DFS模板,今天就搭配模板放几题DFS的例题!! void dfs(){ if(越界或不合理...

[Day14] 架设 Nginx 当我们的 Web Server

.NET 5 Web API 布署到 Linux 上执行的时候,会跑在一个 Kestrel 服务器上...

从零开始学游戏设计:游戏环境之大气效果

这是 Roblox 从零开始系列,游戏环境章节的第二个单元,你将学会如何利用大气效果让游戏变得更加真...