字符串格式化与CSS标签冲突:{}的问题

7
这是我在HTML模板中替换变量的方法。
a1 = '<html><title>{0}</title><body>{1}</body></html>'
 vars = ['test', 'test']
 output = a1.format(*vars)

问题是,当HTML中存在CSS时,它会与CSS标签冲突。
因为CSS包含:
 {}'s

你应该使用一个合适的模板引擎。 - SLaks
我没有时间处理模板引擎。 - SÜMER KOLÇAK
1
你有时间解决这样的问题吗?你应该使用专门设计用于实现你想要的功能的工具。 - SLaks
1
你可以使用双大括号 {{ }} - Himal
1
完全同意@SLaks的观点,虽然我知道双大括号的用法,但我无法违背我所遵循的原则 :) - alecxe
显示剩余7条评论
4个回答

4

备选方案。

由于您有一些HTML和Python代码的混合,我建议通过切换到普通的模板引擎分离逻辑部分和展示部分

以下是使用mako的示例。

创建一个模板HTML文件,并留下适当的“占位符”:

<html>
<head>
    <title>${title}</title>
</head>
<body>
    <p>${text}</p>
</body>
</html>

然后,在Python代码中,提供占位符的值来渲染模板:
from mako.template import Template

t = Template(filename='index.html')
print t.render(title='My Title', text='My Text')

这将会打印出以下内容:
<html>
<head>
    <title>My Title</title>
</head>
<body>
    <p>My Text</p>
</body>
</html>

2

只需要使用双括号即可转义它们。

比如说,

a1 = """div.test{{ 
 bla;
}}"""

2
有几种好的答案可以回答这个问题,但它们可能不适用于每种情况。
  • 使用模板引擎:这是解决 OP 问题的好方法,但在每个环境中安装和导入非标准库(如 mako)可能并不总是可行。

  • 使用双括号 {{ 转义花括号 {:这在某些浏览器中可能会被识别,但在其他浏览器中可能不会(它应该被识别,但可能不会)。

当动态生成 HTML 或从文件中引入 HTML 时,另一个选择是简单地管理 HTML 输出构造的顺序 - 在格式化操作之后执行 CSS 注入。

使用占位符为 CSS 准备模板

my_html = """<html>
<head>
    <title>My Page</title>
    <style></style>
</head>
<body>
    <p>Content = {0}</p>
</body>
</html>"""

my_css = """<style>
      body {
        background-color: gray;
      }
    </style>"""

准备带有格式的HTML输出
my_page = my_html.format('foobar')

在格式化操作后注入CSS
my_final_page = my_page.replace('<style></style>', my_css)

输出

<html>
<head>
    <title>My Page</title>
    <style>
      body {
        background-color: gray;
      }
    </style>
</head>
<body>
    <p>Content = foobar</p>
</body>
</html>

您不一定要使用<style></style>标记对作为占位符。占位符可以是任何东西,只要它是唯一的(这样您就不会意外替换其他内容)。

完整示例

#! /usr/bin/env python
# -*- coding: utf-8 -*-

my_html = """<html>
<head>
    <title>My Page</title>
    <style></style>
</head>
<body>
    <p>Content = {0}</p>
</body>
</html>"""

my_css = """<style>
      body {
        background-color: gray;
      }
    </style>"""

my_page = my_html.format('foobar')

my_final_page = my_page.replace('<style></style>', my_css)

print(my_final_page)

0

你可以像Alecxe说的那样使用模板,也可以使用带有字典的格式化。

a1 = '<html><title>%(title)s</title><body>%(body)s</body></html>'
vars = {'title': 'test', 'body': 'test'}
output = a1 % vars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接