寻求更好的 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的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 调用 python 函数的不同/更好的方法

python 3.x 学习笔记10 (析构函数and继承)

Python静态方法,其实暗藏玄机

python3中内建函数map()与reduce()的使用方法

python 3.x 和 2.x 不同

安装基于Python的Selenium包出现异常的问题寻求解决方法