Подтвердить что ты не робот

Создание HTML-документов в python

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

4b9b3361

Ответ 1

Я считаю 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, с дополнительным преимуществом, что вам не нужно закрывать теги.

Ответ 2

Я бы предложил использовать один из многих языков шаблонов, доступных для 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, которая может загружать шаблоны с диска из предопределенного списка путей поиска, заполнять данными из диктофона и отображать в строку - все в одном вызове функции. (удалено из django 1.8, см. Engine.from_string для сопоставимых действий)

Ответ 3

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

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

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

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

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

PS

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

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

Ответ 4

Если вы создаете документы 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>

Ответ 5

Я использую фрагмент кода, известный как 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>'),
      ]
  ]

Ответ 6

Да, вы ищете файл .writelines

Последовательность, как правило, представляет собой список или массив. Поэтому поместите все ваши строки в список или массив. И бросить их на функцию ниже.

Обязательно удалите все строки из строк, чтобы быть в безопасности

Документация на Python (поиск файлов .writelines)

file.writelines(последовательность)   Напишите последовательность строк в файл. Последовательностью может быть любой итерируемый объект, производящий строки, обычно список строк. Возвратного значения нет. (Имя предназначено для соответствия readlines(); writelines() не добавляет разделителей строк.)