现在在一个网页内有这么一个表格
2月值班表 |
|
|
|
|
|
|
|
星期一 |
星期二 |
星期三 |
星期四 |
星期五 |
本周休息 |
星期六 |
星期日 |
|
|
|
|
021 |
|
022 |
023 |
|
|
|
|
何总 |
|
徐总 |
卢总 |
024 |
025 |
026 |
027 |
028 |
|
029 |
0210 |
王总 |
阿文 |
何总 |
朱总 |
卢总 |
|
朱总 |
何总 |
0211 |
0212 |
0213 |
0214 |
0215 |
|
0216 |
0217 |
阿文 |
徐总 |
王总 |
朱总 |
卢总 |
|
朱总 |
卢总 |
0218 |
0219 |
0220 |
0221 |
0222 |
|
0223 |
0224 |
阿文 |
徐总 |
何总 |
王总 |
朱总 |
|
阿文 |
徐总 |
0225 |
0226 |
0227 |
0228 |
|
|
|
|
卢总 |
阿文 |
徐总 |
何总 |
|
|
|
|
通过 bs4 爬取该网页源码
1 2 3
| html_context = response.text # 解析 html,获取对应的值存入 dict 中 soup = BeautifulSoup(html_context, "html.parser")
|
得到 html 内容大概如下的html 代码,我需要取其中不算标题和星期那一行以下的内容,然后将其进行格式化输出为json 格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| #-*-*coding:utf-8-*- from bs4 import BeautifulSoup import time html = """ <tbody> <tr> <th class="confluenceTh" colspan="8" style="text-align: center;">1月值班表 </th> </tr> <tr> <td class="confluenceTd">星期一</td> <td class="confluenceTd">星期二</td> <td class="confluenceTd">星期三</td> <td class="confluenceTd">星期四</td> <td class="confluenceTd">星期五</td> <td class="confluenceTd">本周休息</td> <td class="confluenceTd">星期六</td> <td class="confluenceTd">星期日</td></tr> <tr>
<td class="confluenceTd"> <span style="color: rgb(255,0,0);"> 31</span></td> <td class="confluenceTd"> <span style="color: rgb(255,0,0);">1</span></td> <td class="confluenceTd">2</td> <td class="confluenceTd">3</td> <td class="confluenceTd">4</td> <td class="confluenceTd"></td> <td class="confluenceTd">5</td> <td class="confluenceTd">6</td></tr> <tr> <td class="confluenceTd"> 阿文</td> <td class="confluenceTd">徐总 </td> <td class="confluenceTd"> 王总</td> <td class="confluenceTd">朱总 </td> <td class="confluenceTd"> 卢总</td> <td class="confluenceTd"></td> <td class="confluenceTd">何炅</td> <td class="confluenceTd">王总</td></tr> <tr> <td class="confluenceTd" colspan="1">7</td> <td class="confluenceTd" colspan="1">8</td> <td class="confluenceTd" colspan="1">9</td> <td class="confluenceTd" colspan="1">10</td> <td class="confluenceTd" colspan="1">11</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">12</td> <td class="confluenceTd" colspan="1">13</td></tr> <tr> <td class="confluenceTd" colspan="1"> 阿文</td> <td class="confluenceTd" colspan="1">徐总 </td> <td class="confluenceTd" colspan="1"> 何炅</td> <td class="confluenceTd" colspan="1"> 王总</td> <td class="confluenceTd" colspan="1"> 朱总</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">朱总</td> <td class="confluenceTd" colspan="1">卢总</td></tr> <tr> <td class="confluenceTd" colspan="1">14</td> <td class="confluenceTd" colspan="1">15</td> <td class="confluenceTd" colspan="1">16</td> <td class="confluenceTd" colspan="1">17</td> <td class="confluenceTd" colspan="1">18</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">19</td> <td class="confluenceTd" colspan="1">20</td></tr> <tr> <td class="confluenceTd" colspan="1"> 卢总</td> <td class="confluenceTd" colspan="1"> 阿文</td> <td class="confluenceTd" colspan="1"> 徐总</td> <td class="confluenceTd" colspan="1"> 何炅</td> <td class="confluenceTd" colspan="1"> 王总</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">阿文</td> <td class="confluenceTd" colspan="1">徐总</td></tr> <tr> <td class="confluenceTd" colspan="1">21</td> <td class="confluenceTd" colspan="1">22</td> <td class="confluenceTd" colspan="1">23</td> <td class="confluenceTd" colspan="1">24</td> <td class="confluenceTd" colspan="1">25</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">26</td> <td class="confluenceTd" colspan="1">27</td></tr> <tr> <td class="confluenceTd" colspan="1"> 朱总</td> <td class="confluenceTd" colspan="1">卢总 </td> <td class="confluenceTd" colspan="1"> 阿文</td> <td class="confluenceTd" colspan="1">徐总 </td> <td class="confluenceTd" colspan="1"> 何炅</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1">何炅</td> <td class="confluenceTd" colspan="1">王总</td></tr> <tr> <td class="confluenceTd" colspan="1">28</td> <td class="confluenceTd" colspan="1">29</td> <td class="confluenceTd" colspan="1">30</td> <td class="confluenceTd" colspan="1">31</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1"> </td></tr> <tr> <td class="confluenceTd" colspan="1"> 王总</td> <td class="confluenceTd" colspan="1"> 朱总</td> <td class="confluenceTd" colspan="1"> 卢总</td> <td class="confluenceTd" colspan="1">阿文</td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1"></td> <td class="confluenceTd" colspan="1"> </td></tr> </tbody> """ ``` 处理表格,分析 ``` soup = BeautifulSoup(html, 'html.parser') data_list = [] 将所有的数据都存储到data_list 中 for idx, tr in enumerate(soup.find_all('tr')): if idx > 1: # 从下标2开始,也就是不要星期和标题那两行 tds = tr.find_all('td') values = [str(w.text).strip() for w in tds] data_list.append(values)
|
但是实际上现在的数据是混在一起的,没有把日期和姓名进行一一的对应,所以我们需要去对数据进行处理,从表格可以看出来期第一行是日期 第二行是姓名,因此我们把第一行和第二行的数据分开,通过判断奇偶数的方式把数据写入2个list 中去。
1 2 3 4 5 6 7 8
| key = [] values = []
for i in range(len(data_list)): if (i % 2) == 0: key.append(data_list[i]) else: values.append(data_list[i])
|
通过创建一个字典,调用zip 将上面的key和value 进行合并操作,最终搞定期日期和姓名的对应关系。
1 2 3 4 5
| dict_list = {} for i in range(len(key)): dict_list.update(dict(zip(key[i], values[i]))) date_time = time.strftime("%m%d", time.localtime()) who_name = dict_list[date_time]
|
最终结果
1 2 3 4 5 6 7 8 9
| { "021": "何总", "022": "徐总", "023": "卢总", "024": "阿文", …… }
|
喜欢新事物,关注云计算行业,对新的技术有追求,喜欢写作和coding