模版
python 有木有 java 的 freemarker 那么好用的模版捏?虽然不太确定,但是 jinja2 在某种程度上和 freemarker 一样令人满意
在 500px 爬虫 这个项目里,我用 jinja2 生成了一个 html 文件,一起来看下
from jinja2 import Environment, PackageLoader
def generate_html_by_jinja2(user, galleries):
env = Environment(loader=PackageLoader('px500', 'templates'))
template = env.get_template('500px.html')
html = template.render(username=user.name, galleries=galleries)
with open(user.name + '.html', 'w', encoding='utf-8') as file:
file.write(html)
模版文件
<!DOCTYPE html>
<html>
<head>
<style>
.gallery {float: left}
.gallery_name {padding: 0px 0px 0px 10px; font-size: 160%}
.photo {border: solid 1px silver; margin: 10px 5px 10px 10px; padding: 10px; float: left }
img {height: 300px }
a {text-decoration: none; color: blue }
a:hover {text-decoration: underline; color: red }
</style>
<base target="_blank"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>{{ username }}@500px</title>
</head>
<body>
{% for gallery in galleries %}
<div class="gallery"><div class="gallery_name">{{ gallery.name }}</div>
{% for image in gallery.images %}
<div class="photo">
<a href="{{ image.url }}">
<img src="{{ image.thumb_url }}">
</a><br>{{ image.name }}
</div>
{% endfor %}
</div>
{% endfor %}
</body>
</html>
说明
- Environment 表示环境,通过传入一个 Loader 可以加载到模版文件
- 这个 Loader 有点问题,比如 PackageLoader 参数名是 package_name,但实际上你要传入的是 module_name
- 又比如 FileSystemLoader,默认是从当前目录查找模版目录,但是同样的代码有时可以找到模版目录有时就不行
- get_template() 方法可以获取到模版实例
- template.render() 以字符串形式返回渲染后的模版内容,该方法接受关键字参数或 dict
模版语言
<!-- 输出变量的值 -->
{{ variable }}
<!-- 执行语句 -->
{% for v in list %}
{% endfor %}