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 文件

6 回复

看看 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 传入字典列表直接安全替换就可以

回到顶部