现在在一个网页内有这么一个表格
| 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 爬取该网页源码
html_context = response.text
soup = BeautifulSoup(html_context, "html.parser")
|
得到 html 内容大概如下的html 代码,我需要取其中不算标题和星期那一行以下的内容,然后将其进行格式化输出为json 格式
#-*-*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 中去。
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 进行合并操作,最终搞定期日期和姓名的对应关系。
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]
|
最终结果
{ "021": "何总", "022": "徐总", "023": "卢总", "024": "阿文", …… }
|
文章作者:阿文
版权声明:本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自
阿文的博客!