使用bs4 处理表格

现在在一个网页内有这么一个表格

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": "阿文",
……

}