Python:需要在HTML模板中替换一系列不同的子字符串为额外的HTML或数据库结果

1 投票
3 回答
563 浏览
提问于 2025-04-15 18:36

情况:

我正在用Python和mod_python写一个简单的模板系统。这个系统会读取一个主要的HTML模板,然后把文档中所有的“:value:”替换成其他的HTML代码或者数据库的结果,最后把处理好的内容展示给用户。

我并不是要替换所有相同的子字符串。值是可以变化的,而且有一个有限的可接受值列表,并不是无限的。值的格式是[冒号]值[冒号]。比如说可能会有“:gallery:”、“:related:”或者“:comments:”。替换的内容可以是额外的静态HTML代码,也可以是调用某个函数。这个函数也可能会有所不同。

问题:

有什么高效的方法可以读取主要的HTML文件,并把那些未知的值组合替换成它们对应的内容吗?


提前感谢任何想法或解决方案,

c

3 个回答

1

这可能是一个需要使用模板引擎的工作。在Python中,有很多不同的选择。在这个StackOverflow的问题中,大家列出了自己最喜欢的模板引擎,并且有些人还很贴心地解释了原因:你最喜欢的Python模板引擎是什么?

4

其实已经有很多现成的模板选项可以使用,比如 genshimakojinja2django模板等等。

你会发现,自己重新发明轮子其实没什么意义,得不到什么好处。

1

如果你因为某种原因不能使用现有的模板系统,那么用正则表达式来解决问题可能是个不错的选择:

import re

valre = re.compile(r':\w+:')

def dosub(correspvals, correspfuns, lastditch):
  def f(value):
    v = value.group()[1:-1]
    if v in correspvals:
      return correspvals[v]
    if v in correspfuns:
      return correspfuns[v]()  # or whatever args you need
    # what if a value has neither a corresponding value to
    # substitute, NOR a function to call?  Whatever...:
    return lastditch(v)
  return f

replacer = dosub(adict, another, somefun)

thehtml = valre.sub(replacer, thehtml)

基本上,你需要两个字典(一个是把值映射到对应的值,另一个是把值映射到要调用的对应函数),还有一个函数,用来处理那些在这两个字典里都找不到的值;上面的代码展示了如何把这些东西组合在一起(我这里用的是闭包,当然用类也可以),以及如何应用它们来完成你需要的替换任务。

撰写回答