python 日历.HTMLCalendar
我想用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"> </td><td class="noday"> </td>
<td class="noday"> </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"> </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"> </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(" "," ")
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日历,但根据你的需求和使用的框架,其实有更好的方法可以做到这一点。