使用bs4 处理表格

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

2月值班表
星期一星期二星期三星期四星期五本周休息星期六星期日
021022023
何总徐总卢总
0240250260270280290210
王总阿文何总朱总卢总朱总何总
0211021202130214021502160217
阿文徐总王总朱总卢总朱总卢总
0218021902200221022202230224
阿文徐总何总王总朱总阿文徐总
0225022602270228
卢总阿文徐总何总

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

}
阿文 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!