Generating HTML documents in python

前端 未结 7 1134
花落未央
花落未央 2020-11-28 03:43

In python, what is the most elegant way to generate HTML documents. I currently manually append all of the tags to a giant string, and write that to a file. Is there a mor

相关标签:
7条回答
  • 2020-11-28 04:07

    I would recommend using xml.dom to do this.

    http://docs.python.org/library/xml.dom.html

    Read this manual page, it has methods for building up XML (and therefore XHTML). It makes all XML tasks far easier, including adding child nodes, document types, adding attributes, creating texts nodes. This should be able to assist you in the vast majority of things you will do to create HTML.

    It is also very useful for analysing and processing existing xml documents.

    Hope this helps

    P.S

    Here is a tutorial that should help you with applying the syntax

    http://www.postneo.com/projects/pyxml/

    0 讨论(0)
  • 2020-11-28 04:14

    If you're building HTML documents than I highly suggest using a template system (like jinja2) as others have suggested. If you're in need of some low level generation of html bits (perhaps as an input to one of your templates), then the xml.etree package is a standard python package and might fit the bill nicely.

    import sys
    from xml.etree import ElementTree as ET
    
    html = ET.Element('html')
    body = ET.Element('body')
    html.append(body)
    div = ET.Element('div', attrib={'class': 'foo'})
    body.append(div)
    span = ET.Element('span', attrib={'class': 'bar'})
    div.append(span)
    span.text = "Hello World"
    
    if sys.version_info < (3, 0, 0):
      # python 2
      ET.ElementTree(html).write(sys.stdout, encoding='utf-8',
                                 method='html')
    else:
      # python 3
      ET.ElementTree(html).write(sys.stdout, encoding='unicode',
                                 method='html')
    

    Prints the following:

    <html><body><div class="foo"><span class="bar">Hello World</span></div></body></html>
    
    0 讨论(0)
  • 2020-11-28 04:15

    I am using the code snippet known as throw_out_your_templates for some of my own projects:

    https://github.com/tavisrudd/throw_out_your_templates

    https://bitbucket.org/tavisrudd/throw-out-your-templates/src

    Unfortunately, there is no pypi package for it and it's not part of any distribution as this is only meant as a proof-of-concept. I was also not able to find somebody who took the code and started maintaining it as an actual project. Nevertheless, I think it is worth a try even if it means that you have to ship your own copy of throw_out_your_templates.py with your code.

    Similar to the suggestion to use yattag by John Smith Optional, this module does not require you to learn any templating language and also makes sure that you never forget to close tags or quote special characters. Everything stays written in Python. Here is an example of how to use it:

    html(lang='en')[
      head[title['An example'], meta(charset='UTF-8')],
      body(onload='func_with_esc_args(1, "bar")')[
          div['Escaped chars: ', '< ', u'>', '&'],
          script(type='text/javascript')[
               'var lt_not_escaped = (1 < 2);',
               '\nvar escaped_cdata_close = "]]>";',
               '\nvar unescaped_ampersand = "&";'
              ],
          Comment('''
          not escaped "< & >"
          escaped: "-->"
          '''),
          div['some encoded bytes and the equivalent unicode:',
              '你好', unicode('你好', 'utf-8')],
          safe_unicode('<b>My surrounding b tags are not escaped</b>'),
          ]
      ]
    
    0 讨论(0)
  • 2020-11-28 04:21

    I find yattag to be the most elegant way of doing this.

    from yattag import Doc
    
    doc, tag, text = Doc().tagtext()
    
    with tag('html'):
        with tag('body'):
            with tag('p', id = 'main'):
                text('some text')
            with tag('a', href='/my-url'):
                text('some link')
    
    result = doc.getvalue()
    

    It reads like html, with the added benefit that you don't have to close tags.

    0 讨论(0)
  • 2020-11-28 04:22

    I would suggest using one of the many template languages available for python, for example the one built into Django (you don't have to use the rest of Django to use its templating engine) - a google query should give you plenty of other alternative template implementations.

    I find that learning a template library helps in so many ways - whenever you need to generate an e-mail, HTML page, text file or similar, you just write a template, load it with your template library, then let the template code create the finished product.

    Here's some simple code to get you started:

    #!/usr/bin/env python
    
    from django.template import Template, Context
    from django.conf import settings
    settings.configure() # We have to do this to use django templates standalone - see
    # http://stackoverflow.com/questions/98135/how-do-i-use-django-templates-without-the-rest-of-django
    
    # Our template. Could just as easily be stored in a separate file
    template = """
    <html>
    <head>
    <title>Template {{ title }}</title>
    </head>
    <body>
    Body with {{ mystring }}.
    </body>
    </html>
    """
    
    t = Template(template)
    c = Context({"title": "title from code",
                 "mystring":"string from code"})
    print t.render(c)
    

    It's even simpler if you have templates on disk - check out the render_to_string function for django 1.7 that can load templates from disk from a predefined list of search paths, fill with data from a dictory and render to a string - all in one function call. (removed from django 1.8 on, see Engine.from_string for comparable action)

    0 讨论(0)
  • 2020-11-28 04:26

    Yes, you are looking for file .writelines

    A sequence is generally a list or array. So put all your lines into a list or array. And toss them to the function below.

    Make sure to remove any new line constants from your strings just to be safe

    Python Documentation ( search for file.writelines )

    file.writelines(sequence) Write a sequence of strings to the file. The sequence can be any iterable object producing strings, typically a list of strings. There is no return value. (The name is intended to match readlines(); writelines() does not add line separators.)

    0 讨论(0)
提交回复
热议问题