如何在Python中生成HTML报告?

9 投票
3 回答
26837 浏览
提问于 2025-04-18 07:54

我想找一种方法,把我所有的图表(这些图表是用matplotlib生成的,已经保存为png文件)和一些数据框以HTML格式打印出来,就像我通常用R2HTML做的那样。

不过我找不到关于Python模块或函数的详细说明,谁能给我一些建议呢?

3 个回答

-4

首先,你需要安装这个软件包,链接是 https://pypi.org/project/html-testRunner/

然后使用下面的代码:

if __name__ == "__main__":
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(
        output= r"here the place where you want to store the your
                  HTML report(mean to say folder path"))
0

有一种方法可以做到,而且看起来非常酷,因为用HTML你可以做很多事情。如果你使用plotly,图表本身就是HTML格式的,所以你可以直接使用它们,并且仍然保留交互功能(比如放大、选择等)。

首先,你需要为Jinja创建一个模板。如果你要显示的图表数量是固定的,那么你可以做一个静态的模板,里面放一些占位符(这样更简单)。如果数量不固定,那就需要用自动化的方法来处理(使用Jinja)。

模板的例子如下:

<!DOCTYPE html>
<html style="text-align:center;">
<head>
    <title> My Report </title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>

....
<div class="main box_around">
    <h2 id="%count_of_unique_obs_over_time"><span> Count of unique obs Over Time </span>
        <hr style="width:60%;">
    </h2>
    <p style="font-size: 21px;">
    <div style="overflow-y:scroll;height: 500px; " align="center">  {{count_of_missing_values_over_time_fig }}</div>
    </p>
</div>

...

接下来,你需要输入图表。(我使用plotly,你可以用“.to_html()”这个方法来实现)

data = {
    "table_name_clean":table_name_clean,
    ...
    "count_of_unique_obs_over_time_fig": count_of_unique_obs_over_time_fig.to_html()
}

最后,你把数据填入模板,然后保存。

with open('html_template.html', 'r') as f:
    html_string = f.read()
j2_template = Template(html_string )
with open(save_output_path, 'w') as f:
    f.write(j2_template.render(data))
3

看起来有几个工具可以用。我主要关注简单的HTML文本写作工具,因为我将完全从头开始制作我的报告页面结构。这可能和R2HTML不太一样,因为我猜它有很多方便的功能,可以把R对象中的内容轻松放到页面里。

HTMLTags
这个家伙在ActiveState社区页面上从零开始写了一个模块:HTMLTags - 在Python中生成HTML(Python食谱)。在评论中,我发现了我在这个回答中列出的多数工具。

htmlgen
这个看起来相当不错且基础。我不确定它是否和这篇旧的文章中描述的是同一个模块。

XIST
这个工具看起来很靠谱,还包括一个解析器。这里有一些示例代码,用来生成页面,展示了你需要使用的格式,以便在各种HTML元素之间插入适当的Python命令。另一种格式使用了很多嵌套的函数调用,这样在Python中插入内容会显得很尴尬。

with xsc.build() :
    with xsc.Frag() as myHtmlReport :
        +xml.XML()
        +html.DocTypeXHTML10transitional()
        with html.html() :
            reportTitle = "My report title"

            with html.head() :
                +meta.contenttype()
                +html.title( reportTitle )

            with html.body() :
                # Insert title header
                +html.h1( reportTitle )

                with html.table() :
                    # Header Row
                    with html.tr() :
                        with html.td() : 
                            +xsc.Text( "Col 1 Header" )
                        with html.td() :
                            +xsc.Text( "Col 2 Header" )


                    # Data Rows
                    for i in [ 1, 2, 3, 4, 5 ] :

                        with html.tr() :
                            with html.td() : 
                                +xsc.Text( "data1_" + str(i) )
                            with html.td() :
                                +xsc.Text( "data2_" + str(i) )

# Write the report to disk
with open( "MyReportfileName.html" , "wb" ) as f:
    f.write( myHtmlReport.bytes( encoding="us-ascii" ) )

libxml2
通过Python绑定,有一个普通的xmlwriter模块,虽然可能太通用,但知道它还是不错的。这个包的Windows二进制文件可以在这里找到。

撰写回答