Python 有没有好办法批量替换 html 模板中的变量生成 html 文件
如题,我试着使用 Template 无法实现
htmlstr="""
<html><head><body>
<input type="text" id="Index_000003_Spec_0001" name="Index_000003_Spec_0001" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000003_Spec_0002" name="Index_000003_Spec_0002" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000003_Spec_0003" name="Index_000003_Spec_0003" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000003_Spec_0004" name="Index_000003_Spec_0004" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0001" name="Index_000004_Spec_0001" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0002" name="Index_000004_Spec_0002" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0003" name="Index_000004_Spec_0003" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0004" name="Index_000004_Spec_0004" class="text" dtype="Integer" require="false" dmsg="" />
<!--.....200 个输入项......-->
<input type="text" id="Index_000004_Spec_0002" name="Index_000014_Spec_0002" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0003" name="Index_000014_Spec_0003" class="text" dtype="Integer" require="false" dmsg="" />
<input type="text" id="Index_000004_Spec_0004" name="Index_000014_Spec_0004" class="text" dtype="Integer" require="false" dmsg="" />
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
$("input[type=text]").prop("readonly",true);
$('#Index_000003_Spec_0001').val('$value1');$('#Index_000003_Spec_0002').val('$value2');$('#Index_000003_Spec_0003').val('$value3');$('#Index_000003_Spec_0004').val('$value4');$('#Index_000004_Spec_0001').val('$value5');$('#Index_000004_Spec_0002').val('$value6');$('#Index_000004_Spec_0003').val('$value7');$('#Index_000004_Spec_0004').val('$value8');
//
$('#Index_000014_Spec_0002').val('$value201');$('#Index_000014_Spec_0003').val('$value202');$('#Index_000014_Spec_0004').val('$value203');
</script>
</body></html>"""
value1,value2,value3,value4,value5,value6,value7,value8=63,“ret”,67,67,356,4,445,26
from string import Template
htmlstr.substitute(value1,value2,value3,value4,value5,value6,value7,value8)
print(htmlstr)
htmlfile = open((“outfile.html”), “w”)
htmlfile.write(htmlstr)
htmlfile.close()
报这个错
AttributeError: 'str' object has no attribute 'substitute':
使用直接赋值也不对,200 多个值一个个赋值实在有些繁琐
htmlstr.substitute(value1=211,value2=421)
Python 有没有好办法批量替换 html 模板中的变量生成 html 文件
看看 jinja2 符不符合你的需求
用Jinja2模板引擎,这是Python里处理HTML模板替换的标准方案。
from jinja2 import Template, Environment, FileSystemLoader
import os
# 方法1:直接字符串渲染(适合简单场景)
template_str = """
<html>
<body>
<h1>{{ title }}</h1>
<p>欢迎 {{ user }}!今天是 {{ date }}</p>
</body>
</html>
"""
data = {
'title': '用户主页',
'user': '张三',
'date': '2024-01-15'
}
template = Template(template_str)
result = template.render(**data)
print(result)
# 方法2:批量处理多个模板文件
def batch_render_templates(template_dir, output_dir, data_list):
"""
template_dir: 模板文件目录
output_dir: 输出目录
data_list: 数据列表,每个元素是一个字典
"""
env = Environment(loader=FileSystemLoader(template_dir))
for i, data in enumerate(data_list):
# 假设模板文件名为 template.html
template = env.get_template('template.html')
html_content = template.render(**data)
# 保存结果
output_file = os.path.join(output_dir, f'output_{i}.html')
with open(output_file, 'w', encoding='utf-8') as f:
f.write(html_content)
print(f'已生成: {output_file}')
# 使用示例
if __name__ == '__main__':
# 准备多组数据
users_data = [
{'title': '用户A主页', 'user': 'Alice', 'date': '2024-01-15'},
{'title': '用户B主页', 'user': 'Bob', 'date': '2024-01-16'},
{'title': '用户C主页', 'user': 'Charlie', 'date': '2024-01-17'}
]
# 批量生成
batch_render_templates(
template_dir='./templates',
output_dir='./output',
data_list=users_data
)
Jinja2支持条件判断、循环等高级功能:
<!-- template.html -->
<html>
<body>
<h1>{{ title }}</h1>
{% if user %}
<p>欢迎 {{ user }}!</p>
{% else %}
<p>欢迎访客!</p>
{% endif %}
<ul>
{% for item in items %}
<li>{{ item.name }} - ¥{{ item.price }}</li>
{% endfor %}
</ul>
</body>
</html>
用Jinja2就对了。
tornado 的 template
参考官方示例:
t = template.Template("<html>{{ myvalue }}</html>")
print(t.generate(myvalue=“XXX”))
http://www.tornadoweb.org/en/stable/template.html
python 的很多 web 框架都有模板系统
也有很多独立的第三方模板。
比如 jinja2, mako, cheatah
其实个人推荐直接用 bottle 带的那个模板引擎。因为 bottle 就一个文件
那个模板语法完全是 Python 脚本包了一层,一看就会了。
谢谢楼上各位回帖,已经直接 template 传入字典列表直接安全替换就可以

