[Day 6] 餐前浓汤 pt.3-BeautifulSoup,第二型态

上一篇我们约略介绍了BeautifulSoup的功用及使用方式
这次我们要来继续介绍BeautifulSoup如何做到更强大,更符合人性的切割方式了
这篇内容会比较短,因为明天开始就是中秋连假,我要先回老家过节啦~
当然回家期间铁人赛也是不会断更的
毕竟断更就炼不成铁人了嘛(?
废话不多说,砸们累狗~

捞取共同资料 = 逻辑问题

相信大家应该应该有玩过逻辑问题
甚麽叫逻辑问题呢,简单来说就是
1, 3, 5, 7, 9, 11, ? 请问 ? 内的数字是啥
没错,就是86413,因为这个数列是所有正整数代入下面多项式的结果
f(x) = 120(x-1)(x-2)(x-3)(x-4)(x-5)(x-6) + (2x-1)

好啦,其实这个就是一个标准的等差数列,大家都知道下一个最有机率出现的数字就是13
因为我们从观察可以发现两数之间相差二,就算可能有意外,但还是这个可能最高
用BeautifulSoup切资料时也一样,我们也可以从tr, td的属性去猜测我们要的资料共同特徵是甚麽
我们可以再回到网页的原始码看看

从原始码可以发现,我们需要的所有资料都包在tr标签内
而且class的名称要马是odd要马是even
那这样我们的目标就非常明确了
我们只要叫服务生出来然後说
「请帮我把tr的部分切出来就好了,啊对我只要odd跟even剩下的部分我不要谢谢」
(请不要真的在餐厅尝试,被主厨赶出来本练功坊概不负责)

那怎麽用程序做这件事情呢
切出tr的部分昨天已经完成了,找单一class名称也完成了
那要怎麽做到寻找任一指定元素呢?简单~
只要把我们的搜寻条件变成list,然後做成dict的value就好了,如下面的code所示

tr_tag = soup.find_all("tr", {"class": ["odd", "even"]})

那我们一样把搜寻条件修改成这个形式,然後把list的元素用迭代(Iterative, 就是用for回圈啦)print出来
所以现在的程序码应该会变成如下所示:

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"]})
for i in tr_tag:
    print(i)

最後执行结果如下(用笔电背景不一样纯属自然现象,敬请安心食用)

我们发现似乎还是有一些杂物在我们的结果里面
像是有些空的tr内容,还有一些不必要的备注
一样,我们再做一次观察
发现我们需要的资料就是包含要马三个或五个的td标签
所以我们就再把只含三个获五个td标签的tr标签捞出来
因此我们再修改一下我们的程序码

首先,我们先定义一个空的list,等等准备把捞出来的tr标签放进来
tr_result = []
然後我们修改一下我们的迭代内容,改成如下:

for i in tr_tag:
    td_tag = i.find_all("td")
    if len(td_tag) == 3 or len(td_tag) == 5:
        print(td_tag)
        tr_result.append(i)

这段的目的是我们把每个tr标签内的td标签捞出来,并且看看td标签是否为三个或五个
是的话我们把它显示出来(这里是为了方便观察,正式版本可以把这个Code删掉)
并且存在我们刚刚定义的list内
最後我们再执行一次看看结果,这次的资料就变得非常乾净了

好的到这边,我们已经成功地把所有需要的资料都捞下来了
接下来就会教大家如何再进一步去芜存菁,只把我们要的数据留下来
以及这些数据要如何储存
欲想知道这个复杂的程序码如何到最後变成漂亮舒服的数据
咱们下回分解~


<<:  DAY 02 CSS 预处理器

>>:  [前端暴龙机,Vue2.x 进化 Vue3 ] Day8. v-model 修饰符 -- 省下自己写 JS 处理的时间

Day02-CRUD API 实作(二)Laravel Sanctum 会员注册、登入、登出

大家好~ 今天要来使用 Laravel Sanctum 实作会员系统! 实作过程 建立 Contro...

Day 23 - Rancher Fleet 环境架设与介绍

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...

安装FireBase入门 Day 10

今天转换一下跑道,来谈谈该如何安装FireBase 首先我先上网搜寻了二三十个网站,教我怎麽去安装F...

【Day 30】实作 - 如何在 AWS Quicksight 设定告警以及结语

昨天我们提到 AWS CloudWatch Alarms,今天我们就来介绍 AWS QuickSig...

Day 23-制作购物车之设计SideDrawer&Backdrawer

设计的部分就不多做分析,主要呈现实作成果。 以下内容有参考教学影片,底下有附网址。 (内容包括我的不...