寻求更好的 Python 3.x+ 方法在一个函数中构建多个不同的 HTML
Posted
技术标签:
【中文标题】寻求更好的 Python 3.x+ 方法在一个函数中构建多个不同的 HTML【英文标题】:Seeking a better Python 3.x+ approach to build multiple different HTMLs within a function 【发布时间】:2018-02-01 03:35:29 【问题描述】:我已经编写了一个函数,它接受具有多个值的 dict。它的功能类似于“邮件合并”,将字典中的值插入 html 中的不同位置。然后,所有 HTML 都会在不同的字典中返回。
这对于长 HTML 文件不是很有效。我正在寻找一种更好的方法来将 20 多个值插入到可能有 100 行长的 HTML 中。
下面包含一个简化版本,显示了效率低下的方法。
def build_html(mail_data):
html_to_convert =
for data in mail_data:
export_html = '<html><head><title>'
export_html += str(data['html_header'])
export_html += '</title></head><body>'
export_html += str(data['html_body'])
export_html += '</body></html>'
html_to_convert[str(data['unique_id'])] = export_html
return html_to_convert
【问题讨论】:
【参考方案1】:在另一个答案的基础上 - 您可以将格式字符串带到函数之外,因为它每次都是一样的。另外,我建议使用.format
,而不是%
。你可以像这样使用.format
:
BUILD_FORMAT = '<html><head><title>0[html_header]</title></head><body>0[html_body]</body></html>'
def build_html(mail_data):
html_to_convert =
for data in mail_data:
export_html = BUILD_FORMAT.format(data)
html_to_convert[str(data['unique_id'])] = export_html
return html_to_convert
这导致实际上根本不必为 html 构建手动调用 str
。但是我不认为真的有任何方法可以让你的代码运行得更快——如果这个循环是必不可少的,你就不能大大提高你的运行时间,尽管我对周围的上下文了解不多,无法给出太多建议。
【讨论】:
【参考方案2】:HTML 模板的基本代码
from bs4 import BeautifulSoup as Soup
# Construct basic webpage template
# Part images will be injected into the body <div> tag
html ="""
<html>
<head>
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto+Slab">
<style>
body
font-family: 'Roboto Slab', serif;
font-size: 24px;
</style>
</head>
<body>
<div></div>
<script>
</body>
"""
把它变成一个函数,重复使用你所有的邮件,添加元素来满足你的需求
soup = Soup(html, 'lxml')
new_tag = soup.new_tag('h2', id='This is a header tag')
soup.div.append(new_tag)
new_tag.string = "Add some text to the h2"
如果需要,将其写入本地驱动器
# Write html local hard drive
with open('updated.html', 'w', newline='') as f:
f.write(str(soup))
【讨论】:
【参考方案3】:你可以尝试字符串格式化而不是连接:
def build_html(mail_data):
html_to_convert =
for data in mail_data:
export_html = '<html><head><title>%s</title></head><body>%s</body></html>' % (str(data['html_header']), str(data['html_body']))
html_to_convert[str(data['unique_id'])] = export_html
return html_to_convert
在数据不是字符串的情况下,您可以使用正确的格式标志来加快处理速度,而不是将其转换为字符串。
【讨论】:
以上是关于寻求更好的 Python 3.x+ 方法在一个函数中构建多个不同的 HTML的主要内容,如果未能解决你的问题,请参考以下文章