it-swarm.com.ru

Генерация HTML-документов в python

В Python, какой самый элегантный способ генерировать документы HTML. В настоящее время я вручную добавляю все теги в гигантскую строку и записываю это в файл. Есть ли более элегантный способ сделать это?

53
shoes

Я считаю yattag самым элегантным способом сделать это.

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()

Это читается как HTML, с дополнительным преимуществом, что вам не нужно закрывать теги.

43
John Smith Optional

Я бы предложил использовать один из многих языков шаблонов, доступных для python, например, один встроенный в Django (вам не нужно использовать оставшуюся часть Django, чтобы использовать его шаблонизаторы двигатель) - запрос Google должен дать вам множество других альтернативных реализаций шаблонов.

Я считаю, что изучение библиотеки шаблонов помогает во многих отношениях - когда вам нужно сгенерировать электронную почту, HTML-страницу, текстовый файл или подобное, вы просто пишете шаблон, загружаете его в свою библиотеку шаблонов, а затем позволяете создавать код шаблона. готовый продукт.

Вот простой код для начала работы:

#!/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)

Еще проще, если у вас есть шаблоны на диске - проверьте функцию render_to_string для Django 1.7, которая может загружать шаблоны с диска из предопределенного списка путей поиска, заполнять данными из dictory и рендеринг в строку - все в одном вызове функции. (удалено из Django 1.8 включено, см. Engine.from_string для сопоставимых действий)

29
Erik Forsberg

Если вы создаете документы HTML, я настоятельно рекомендую использовать систему шаблонов (например, jinja2 ), как предлагали другие. Если вам нужна генерация html-битов низкого уровня (возможно, в качестве входных данных для одного из ваших шаблонов), тогда пакет xml.etree является стандартным пакетом python и может соответствовать всем требованиям.

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')

Печатает следующее:

<html><body><div class="foo"><span class="bar">Hello World</span></div></body></html>
7
cheshirekow

Я бы порекомендовал использовать xml.dom для этого.

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

Прочтите эту страницу руководства, у нее есть методы для создания XML (и, следовательно, XHTML). Это значительно упрощает все задачи XML, включая добавление дочерних узлов, типов документов, добавление атрибутов, создание текстовых узлов. Это должно помочь вам в подавляющем большинстве вещей, которые вы будете делать для создания HTML.

Это также очень полезно для анализа и обработки существующих XML-документов.

Надеюсь это поможет

P.S

Вот учебник, который должен помочь вам с применением синтаксиса

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

6
Sheik Yerbouti

Я использую фрагмент кода, известный как throw_out_your_templates, для некоторых моих собственных проектов:

https://github.com/tavisrudd/throw_out_your_templates

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

К сожалению, для него нет пакета pypi, и он не является частью какого-либо дистрибутива, поскольку он предназначен только для проверки концепции. Я также не смог найти кого-то, кто взял код и начал поддерживать его как реальный проект. Тем не менее, я думаю, что стоит попробовать, даже если это означает, что вы должны отправить свою собственную копию throw_out_your_templates.py вместе с вашим кодом.

Как и в случае предложения использовать yattag от John Smith Optional, этот модуль не требует изучения какого-либо языка шаблонов, а также гарантирует, что вы никогда не забудете закрыть теги или заключить в кавычки специальные символы. Все остается написанным на Python. Вот пример того, как его использовать:

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>'),
      ]
  ]
2
josch