如何在Python中生成HTML报告?
我想找一种方法,把我所有的图表(这些图表是用matplotlib生成的,已经保存为png文件)和一些数据框以HTML格式打印出来,就像我通常用R2HTML
做的那样。
不过我找不到关于Python模块或函数的详细说明,谁能给我一些建议呢?
3 个回答
首先,你需要安装这个软件包,链接是 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"))
有一种方法可以做到,而且看起来非常酷,因为用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))
看起来有几个工具可以用。我主要关注简单的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二进制文件可以在这里找到。