Python 在 HTML 标签中使用 file.write

3 投票
2 回答
1083 浏览
提问于 2025-04-21 02:49

我刚开始学习Python,我的第一个脚本是一个非常简单的工作日志。每当我完成工作后,就运行这个脚本,按下回车键,它就会把工作时间记录到一个HTML文件里,我会把这个文件分享给雇我的人。

这是我的代码,请不要笑我,这只是我刚开始的尝试:

#!/usr/bin/python
import datetime
start = datetime.datetime.now()
startt = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print "Counting worktime started."
confirm = raw_input("Press enter when work finished ")
finish = datetime.datetime.now()
delta = finish - start
print datetime.datetime.now()
print delta.seconds
work_time=str(datetime.timedelta(seconds=delta.seconds))
finisht=str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
note = raw_input("What were you doing? ")
line1=['<span>','Work started: <b>', startt, '</b></span><br />']
line1f=' '.join(line1)
line2=['<span>','Work ended: <b>', finisht, '</b></span><br />']
line2f=' '.join(line2)
line3=['<span>','Work duration: <b>', work_time,'</b></span><br />']
line3f=' '.join(line3)
line4=['<span>','Note: <b>', note,'</b></span><br /><br />']
line4f=' '.join(line4)
with open("/srv/www/worklog.html","a") as worklog:
    worklog.write(line1f)
    worklog.write("\n")
    worklog.write(line2f)
    worklog.write("\n")
    worklog.write(line3f)
    worklog.write("\n")
    worklog.write(line4f)
    worklog.write("\n")
    worklog.write("<span> ========================= </span><br /><br />")
    worklog.write("\n")

这是生成的worklog.html文件:

<html>
<head></head>
<body style="background-color: #195B83;color:#FFF;margin: 0px;">
    <style>
        span {font-size: 12px;margin-left: 5px;}
        .logo {float: right;margin-right: 10px;margin-top:5px;}
        .first-div {background-color: #FFF; color:#195B83;width:100%;}
        .sec-div {margin-left: 5px;}
    </style>
    <div class="first-div">
        <img src="logo.png" class="logo" />
        <div class="sec-div">
            <h1>simple worklog 1.0</h2>
        </div>
    </div>
    <br />
    <span> ========================= </span><br /><br />
    <span> Work started: <b> 2014-09-11 13:40:26 </b></span> <br />
    <span> Work ended: <b> 2014-09-11 13:40:29 </b></span> <br />
    <span> Work duration: <b> 0:00:02 </b></span> <br />
    <span> Note: <b> Testing </b></span><br /><br />
    <span> ========================= </span><br /><br />

而且它能正常工作!

我想问的是——我该如何添加

</body></html>

标签?我试过用.replace方法,但我的实验失败了,整个文件都被清空了。你能给我一点建议,让这个脚本在worklog.html的末尾保留这些标签吗?

编辑:

感谢下面的精彩建议,我已经重写了代码,现在我觉得它更有意义了,你可以在这里找到它:

主脚本(将日志添加到CSV并将数据添加到网站): http://pastebin.com/ZbCqJ9p9

页面刷新器(不添加工作日志,只是将数据放到网站上): http://pastebin.com/3hi077RK

模板(带有Bootstrap CSS): http://pastebin.com/xZ7VmE1U

数据文件格式: http://pastebin.com/0KNAXuqh

它的样子是这样的: http://elysium.c-call.eu/sworklog/

这肯定不是最高水平的,存在一些问题,但比我最开始的那个要好很多 :)

非常感谢大家。

2 个回答

2

不要通过手动拼接字符串来重新发明轮子,自己构造 HTML。这样做会让代码变得不易阅读、显得不清晰、复杂,还难以维护,容易出错。其实有一些专门的工具,可以让这件事情变得简单又愉快。

可以考虑使用模板引擎,比如 jinja2 或者 mako

基本上,你会创建一个包含占位符的 HTML 模板,在渲染时用数据填充这些占位符。

以下是使用 mako 模板引擎的例子。

  • 假设你有一个名为 template.html 的模板,内容如下:

    <!DOCTYPE html>
    <html>
    <head>
        <title>${title}</title>
    </head>
    <body>
        <span>
            Work started: ${work_time}
        </span>
    </body>
    </html>
    
  • 你的渲染代码可能看起来像这样:

    from datetime import date
    from mako.template import Template
    
    
    template = Template(filename='template.html')
    
    title = 'Test page'
    work_time = date.today()
    print template.render(title=title, work_time=work_time)
    

它会输出:

<!DOCTYPE html>
<html>
<head>
    <title>Test page</title>
</head>
<body>
    <span>
        Work started: 2014-09-11
    </span>
</body>
</html>

或者,你也可以在 Python 代码中逐个构建 HTML 标签。

以下是使用 BeautifulSoup 的例子:

from bs4 import BeautifulSoup


soup = BeautifulSoup()
html = soup.new_tag(name='html')
body = soup.new_tag(name='body')

span = soup.new_tag(name="span")
span.append(soup.new_string('Work started:'))

body.append(span)
html.append(body)
soup.append(html)

print soup.prettify()

输出结果是:

<html>
 <body>
  <span>
   Work started:
  </span>
 </body>
</html>
4

我觉得可以稍微调整一下你的做法,让它更简洁。

与其直接把日志写入HTML文件,不如考虑把你的数据(开始时间和结束时间)存储到一个CSV文件(或者文本文件、SQLite数据库,或者你想用的其他格式)。Python有一个内置库可以处理CSV文件

然后,你可以运行另一个脚本来提取这些数据,处理后生成一个HTML页面。因为你每次都会重新生成HTML页面,所以不需要担心把新数据插入到HTML的正确位置。

把数据和展示分开是个好习惯,这样可以更方便地在不同地方重用数据。在这个例子中,如果你把数据保存在CSV文件中,你还可以用电子表格软件打开它,制作一些漂亮的图表给你的老板看;)

撰写回答