我正在尝试创建一个HTML文件,它确定必须要评估的Python变量。我的代码如下所示:
name = ['Nora', 'John', 'Jack', 'Jessica']
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Names</title>
</head>
<body>
<ul>
<li>Mother: <%= name[0] %></li>
<li>Father: <%= name[1] %></li>
<li>Son: <%= name[2] %></li>
<li>Daughter: <%= name[3] %></li>
</ul>
</body>
</html>
"""
Html_file = open("names.html","w")
Html_file.write(html)
Html_file.close()
但是,在输出期间不会解释该数组。我的HTML源代码如下:
...
<ul>
<li>Mother: <%= name[0] %></li>
<li>Father: <%= name[1] %></li>
<li>Son: <%= name[2] %></li>
<li>Daughter: <%= name[3] %></li>
</ul>
...
如何评估被<%= %>
包围的python代码?
答案 0 :(得分:0)
html = """<ul>
<li>Mother: {0} </li>
<li>Father: {1} </li>
<li>Son: {2} </li>
<li>Daughter: {3} </li>
</ul>"""
name = ['Nora', 'John', 'Jack', 'Jessica']
print(html.format(*name))
>>><ul>
<li>Mother: Nora </li>
<li>Father: John </li>
<li>Son: Jack </li>
<li>Daughter: Jessica </li>
</ul>
答案 1 :(得分:0)
字符串不会自动评估内部代码,但您可以通过以下几种方式实现此目的:
介绍占位符并格式化字符串:
name = ['Nora', 'John', 'Jack', 'Jessica']
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Names</title>
</head>
<body>
<ul>
<li>Mother: {0}</li>
<li>Father: {1}</li>
<li>Son: {2}</li>
<li>Daughter: {3}</li>
</ul>
</body>
</html>
"""
Html_file = open("names.html","w")
Html_file.write(html.format(name[0], name[1], name[2], name[3])
Html_file.close()
这是一种非常简单的方法。有更高级的方法,例如使用模板引擎。 Here您可以详细了解它们。
答案 2 :(得分:0)
有多种方法可以实现此
首先,如果您使用 Python 3.6或更高版本,那么会出现一种名为f-string的新语法,它基本上是一种在运行时进行字符串格式化的方法。
name = ['Nora', 'John', 'Jack', 'Jessica']
html = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Names</title>
</head>
<body>
<ul>
<li>Mother: {name[0]}</li>
<li>Father: {name[1]}</li>
<li>Son: {name[2]}</li>
<li>Daughter: {name[3]}</li>
</ul>
</body>
</html>
"""
print(html)
使用f-string的方式相当简单,在字符串的开头添加f
,并使用{
}
代替<%= %>
。
如果您使用的是任何Python版本,或者想要版本兼容的方法,那么string interpolation还有许多其他方式(即C风格的字符串格式化{{ 1}},Python字符串格式%
和字符串连接),其中一个(.format()
)在其他答案中。
.format()
和re
如果你无法控制你需要被替换的地方&#34; html,或者如果您必须使用eval
方案,您只需使用<%= %>
和re
的组合:
eval
答案 3 :(得分:0)
您可以使用正则表达式更准确地评估模板:
import re
name = ['Nora', 'John', 'Jack', 'Jessica']
def render_template(html, **kwargs):
return re.sub('\<%\=\s[a-zA-Z]+\[\d+\]\s%\>', '{}', html).format(*[kwargs.get(re.findall('[a-zA-Z]+', i)[0])[int(re.findall('\d+', i)[0])] for i in re.findall('(?<=\<%\=\s)[a-zA-Z]+\[\d+\](?=\s%)', html)])
print(render_template(html, name = name))
输出:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Names</title>
</head>
<body>
<ul>
<li>Mother: Nora</li>
<li>Father: John</li>
<li>Son: Jack</li>
<li>Daughter: Jessica</li>
</ul>
</body>
</html>
如果以随机顺序访问name
元素,此解决方案也将起作用:
html = """
<body>
<ul>
<li>Mother: <%= name[3] %></li>
<li>Father: <%= name[1] %></li>
<li>Son: <%= name[0] %></li>
<li>Daughter: <%= name[2] %></li>
</ul>
</body>
"""
print(render_template(html, name = name))
输出:
<body>
<ul>
<li>Mother: Jessica</li>
<li>Father: John</li>
<li>Son: Nora</li>
<li>Daughter: Jack</li>
</ul>
</body>