How to generate HTML report in Python?
Asked Answered
S

3

9

I'm looking for a way to print out all my graphs (from matplotlib but already saved as png files) and some data frames in HTML, just like what I usually do with R2HTML.

However I couldn't find detailed descriptions about Python module or functions doing this. Could anyone give me some suggestions?

Storms answered 29/5, 2014 at 5:42 Comment(0)
S
3

Looks like a couple of tools exist. I've focused on simple html text writers since I'll be crafting my report page structures completely from scratch. This may differ from the R2HTML which I would guess has a lot of convenience functionality for the sort of things one wishes to stuff into pages from R objects.

HTMLTags This fella wrote a module from scratch at this ActiveState community page: HTMLTags - generate HTML in Python (Python recipe). In the comments I discovered most of the tools I enumerate for this answer.

htmlgen This package looks pretty good and basic. I'm not sure if its the same module described in this old article.

XIST this one looks pretty legit and includes a parser as well. Here's some sample page generation code using the format that you'll need to use to interject all the appropriate python commands inbetween various html elements. The other format utilizes a bunch of nested function calls which will make the python interjection very awkward at best.

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 through Python bindings there's a plain vanilla xmlwriter module, which is probably too generic but good to know about nonetheless. Windows binaries for this package can be found here.

Sachi answered 6/3, 2015 at 21:9 Comment(0)
P
0

There is a way, and it can look quite cool because you have unlimited option with html. Also if you are using plotly, the plots are already in html hence you can transfer them as they are and still keep the interactivity (zoom in, select etc)

First you create a template for Jinja. If the number of graphs is predefined then you just have a static one with placeholders (that's easier), otherwise you need to automate it. (using jinja )

Example of the template.html

<!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>

...

Then you input the graph. ( I use plotly that you can use the ".to_html()" method)

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

and finally you fill the template with the data and you save.

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))
Peddada answered 2/8, 2023 at 15:31 Comment(0)
M
-4

first install the package https://pypi.org/project/html-testRunner/

and use

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"))
Morbihan answered 24/4, 2019 at 10:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.