如何评估html字符串中的Python代码?

时间:2018-03-14 10:52:58

标签: python html string-formatting

我正在尝试创建一个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代码?

4 个答案:

答案 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())在其他答案中。

不改变您的HTML:使用.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>