在CGI文件中遍历列表并以HTML格式输出值
我在一个cgi文件里有两个列表:
数字 = [0, 1, 2, 3]
字母 = [A, B, C, D]
我想知道怎么遍历这两个列表,并把它们的值打印成html格式。
我希望我的表格看起来像这样:
0 A
1 B
2 C
3 D
等等。
这意味着表格的行数和列数要根据我的列表长度和数量来决定。所以我还需要知道怎么遍历列表,并在遍历的同时用html代码创建表格。
到目前为止,我已经做了这些:
print'''
<html>
<head>
</head>
<body>
<center>
<table border="0" cellspacing="15">
<tr>
<td align="center" style="font-size:1.25em;">
<p class="sansserif"> <b> Number: %d </b> <br>
Letter: %s </p>
</td>
</tr>
</table>
</center>
</body>
</html>'''%(Number, Letter)
但是这并没有真正遍历列表,我只是知道了列表的大小,并为此写了必要的代码。而且这只是在表格的一个单元格里打印出了:
0
A
这两个值。
1 个回答
1
有两种选择
使用标准字符串格式化函数
你尝试用 %
来创建结果内容,这个方向是对的。
不过,由于你的输出中有循环(也就是多行内容),而且 %
和 string.format
都不支持循环,所以你需要在代码中自己创建这些“循环内容”,最后再把它嵌入到结果页面中。
bigtempl = '''<html>
<head>
</head>
<body>
<center>
<table border="0" cellspacing="15">
{rows}
</table>
</center>
</body>
</html>'''
rowtempl = """
<tr>
<td align="center" style="font-size:1.25em;">
<p class="sansserif"> <b> Number: {number:d} </b> <br>
Letter: {letter} </p>
</td>
</tr>
"""
numbers = [0, 1, 2, 3]
letters = ["A", "B", "C", "D"]
lst = zip(numbers, letters)
rows = [rowtempl.format(number=number, letter=letter) for number, letter in lst]
rows = "".join(rows)
wholepage = bigtempl.format(rows=rows)
print wholepage
使用高级模板库
有很多工具包可以根据模板和数据结构生成内容。这些工具通常支持循环。
我曾经决定继续使用 jinja2
,我对此很满意。在 Jinja2 中,你的任务看起来是这样的:
import jinja2
templ = '''<html>
<head>
</head>
<body>
<center>
<table border="0" cellspacing="15">
{% for number, letter in lst %}
<tr>
<td align="center" style="font-size:1.25em;">
<p class="sansserif"> <b> Number: {{number}} </b> <br>
Letter: {{letter}} </p>
</td>
</tr>
{% endfor %}
</table>
</center>
</body>
</html>'''
numbers = [0, 1, 2, 3]
letters = ["A", "B", "C", "D"]
lst = zip(numbers, letters)
template = jinja2.Template(templ)
print template.render(lst=lst)
其他模板解决方案的做法也非常相似。