python 日历.HTMLCalendar

6 投票
6 回答
22733 浏览
提问于 2025-04-15 12:46

我想用Python自带的日历模块来创建一个带数据的HTML日历。我说“想”是因为我可能会想到更好的方法,但现在这个想法对我来说有点私人。我不知道这个模块是否本来就是为了这样使用的,但如果不能把日期做成链接,那就感觉有点没意思。

这个代码会设置一个本月的日历,星期天作为第一天。

import calendar
myCal = calendar.HTMLCalendar(calendar.SUNDAY)
print myCal.formatmonth(2009, 7)

它会打印出

<table border="0" cellpadding="0" cellspacing="0" class="month">\n<tr>
<th colspan="7" class="month">July 2009</th></tr>\n<tr><th class="sun">Sun</th>
<th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th>
<th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>\n
<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>
<td class="noday">&nbsp;</td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td>
<td class="sat">4</td></tr>\n<tr><td class="sun">5</td><td class="mon">6</td><td class="tue">7</td>
<td class="wed">8</td><td class="thu">9</td><td class="fri">10</td>
<td class="sat">11</td></tr>\n<tr><td class="sun">12</td><td class="mon">13</td>
<td class="tue">14</td><td class="wed">15</td><td class="thu">16</td><td class="fri">17</td>
<td class="sat">18</td></tr>\n<tr><td class="sun">19</td><td class="mon">20</td>
<td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td>
<td class="sat">25</td></tr>\n<tr><td class="sun">26</td><td class="mon">27</td>
<td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="fri">31</td>
<td class="noday">&nbsp;</td></tr>\n</table>\n

我想在HTMLCalendar对象渲染HTML字符串之前插入一些数据,但我就是搞不明白怎么做。

比如说

<td class="tue">28<br />[my data]</td>

6 个回答

16

日历模块以前一直没什么用,但在2.5版本中引入了一个叫做Calendar的对象。这个对象不会直接给你生成一个HTML格式的日历,但它有很多方法可以帮助你自己制作一个日历。

比如,monthdatescalendar(year, month)这个方法可以给你一个指定年份和月份的所有周的列表,每一周又是七天的列表。所以,monthdatescalendar(2009, 7)会返回一个列表,开始是 [[datetime.date(2009, 6, 29), datetime.date(2009, 6, 30), 结束是 datetime.date(2009, 8, 1), datetime.date(2009, 8, 2)]]

有了这些数据,接下来生成你想要的HTML就变得非常简单了。

45

创建一个新的类,继承自HTMLCalendar。

重写formatday这个方法。

那些评论“这个库没用”的人,显然不懂Python。

class EmployeeScheduleCalendar(HTMLCalendar):
    def formatday(self, day, weekday):
        """
          Return a day as a table cell.
        """
        if day == 0:
            return '<td class="noday">&nbsp;</td>' # day outside month
        else:
            return '<td class="%s"><a href="%s">%d</a></td>' % (self.cssclasses[weekday], weekday, day)
0

你可以把看起来像有效的XML的HTML加载到一个XML树里,进行修改,然后再输出。比如,这段代码会在每个星期二的节点后面加上<br/> cool

import calendar
import xml.etree.ElementTree as etree

myCal = calendar.HTMLCalendar(calendar.SUNDAY)
htmlStr = myCal.formatmonth(2009, 7)
htmlStr = htmlStr.replace("&nbsp;"," ")

root = etree.fromstring(htmlStr)
for elem in root.findall("*//td"):
    if elem.get("class") != "tue":
        continue
    elem.text += "!"

    br = etree.SubElement(elem, "br")
    br.tail = "cool!"

print etree.tostring(root)

我还不太清楚你为什么需要生成一个HTML日历,但根据你的需求和使用的框架,其实有更好的方法可以做到这一点。

撰写回答