Original on entrian.com

Простая и легкая система для работы с HTML (а также XML, неофициально) с использованием объектной модели Pythonic. PyMeld - это единый модуль Python, PyMeld.py. Данная бета-версия требует Python 2.2 или выше, но окончательный релиз может работать с предыдущими версиями Python (правда, с несколько ограниченными возможностями), если будет достаточный спрос.

Особенности:

  • Позволяет программную логику и HTML, чтобы быть полностью отделена - графический дизайнер может дизайн HTML в визуальный редактор HTML, без необходимости иметь дело с любой нестандартный синтаксис или нестандартные имена атрибутов. Программный код ничего не знает о XML или HTML - это просто дело с объектами и атрибутами, как и любой другой кусок кода Python.
  • Разработанный с общим прикладного программирования HTML задач в виду. Заполнение HTML формы с записи из базы данных в одну строчку (с помощью % оператора - см. ниже). Строительство таблицы HTML из набора записей, так же легко, как показано на примере ниже.
  • Никаких специальных требований к HTML / XML (или только один: значения атрибутов должны быть заключены в кавычки) - так что вы можете использовать любой редактор, и ваша HTML / XML не должны быть строго выполняется.
  • Работы по строке замещения, а не путем разложения и восстановления разметки, следовательно, не влияет на части страницы вы не манипулировать.
  • Ничего не делает, но манипулирования HTML / XML, следовательно, вписывается в любой другой веб-инструментарий вы используете.
  • Tracebacks всегда указывают на нужное место - много Python / HTML смешивания системы используют Exec или EVAL, делая ошибки трудно отследить.

Быстрый обзор

PyMeld.Meld объект представляет собой документ XML, или часть одного. Все элементы в документе с id=name атрибутов становятся доступными по объекту Meld как object.name. Атрибуты элементов доступны так же. Краткий пример стоит тысячи слов:

>>> from PyMeld import Meld

>>> xhtml = '''<html><body>

... <textarea id="message" rows="2" wrap="off">Type your message.</textarea>

... </body></html>'''

>>> page = Meld(xhtml)                # Create a Meld object from XHTML.

>>> print page.message                # Access an element within the document.

<textarea id="message" rows="2" wrap="off">Type your message.</textarea>

>>> print page.message.rows           # Access an attribute of an element.

2

>>> page.message = "New message."     # Change the content of an element.

>>> page.message.rows = 4             # Change an attribute value.

>>> del page.message.wrap             # Delete an attribute.

>>> print page                        # Print the resulting page.

<html><body>

<textarea id="message" rows="4">New message.</textarea>

</body></html>

Так логику программы и HTML полностью разделены - графический дизайнер может дизайн HTML в визуальный редактор XHTML, без необходимости иметь дело с любыми нестандартными синтаксиса или нестандартные имена атрибутов. Программный код ничего не знает о XML или HTML - это просто дело с объектами и атрибутами, как и любой другой кусок кода Python. Заполнение формы HTML с записи из базы данных в одну строчку (с помощью % оператора - см. ниже) ниже. Строительство HTML таблицу из набора записей, так же легко, как показано на примере:

Реальный пример:

Вот данными пример заполнения таблицы из источника данных, основываясь на таблице выборочных данных положить в разработчик страницы. Отметим, что в реальном мире HTML, как правило, больше чтения страницы из внешнего файла, сохраняя и представления данных отдельно, и данных будет поступать из внешних источников, как СУБД. HTML может быть полной стилей, образов, все, что вам нравится, и все будет так же.

>>> xhtml = '''<html><table id="people">

... <tr id="header"><th>Name</th><th>Age</th></tr>

... <tr id="row"><td id="name">Example name</td><td id="age">21</td></tr>

... </table></html>'''

>>> doc = Meld(xhtml)

>>> templateRow = doc.row.clone()  # Take a copy of the template row, then

>>> del doc.row                    # delete it to make way for the real rows.

>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:

...      newRow = templateRow.clone()

...      newRow.name = name

...      newRow.age = age

...      doc.people += newRow

>>> print re.sub(r'</tr>\s*', '</tr>\n', str(doc))  # Prettify the output

<html><table id="people">

<tr id="header"><th>Name</th><th>Age</th></tr>

<tr id="row"><td id="name">Richie</td><td id="age">30</td></tr>

<tr id="row"><td id="name">Dave</td><td id="age">39</td></tr>

<tr id="row"><td id="name">John</td><td id="age">78</td></tr>

</table></html>

Заметим, что если вы собираетесь в дальнейшем манипулировать таблице, используя PyMeld или JavaScript, например, вам нужно переименовать каждую row, name и age элемент иметь уникальное имя - вы можете сделать это путем направления в id атрибута, но я "В. Е. пропущен, что сделать пример проще.

Как пример показывает, += оператор добавляет содержимое элемента - добавление <tr> элементов <table> в этом случае.

Клавиши быстрого доступа: оператор %

Использование object.id = value синтаксиса для каждой операции можно получить утомительно, поэтому Есть клавиш вы можете взять использованием % оператора. Это работает так же, как встроенные % оператора для строк. В приведенном выше примере можно было бы написать так:

>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:

...      doc.people += templateRow % (name, age)

% оператора, с учетом одного значения или последовательности, присваивает значения элементов с `ID` в порядке, что они появляются, как и % оператора для строк. Обратите внимание, что нет необходимости звонить clone(), когда вы используете %, так как он автоматически возвращается изменение клон (опять же, как и % делает для строк). Вы можете также использовать словарь: 
>>> print templateRow % {'name': 'Frances', 'age': 39}

<tr id="row"><td id="name">Frances</td><td id="age">39</td></tr>

% оператора действительно полезно, когда у вас есть большое количество элементов данных - например, заполнение формы HTML с записи с СУБД становится один вкладыш.

Заметим, что эти примеры написаны для ясности, а не производительность, и не обязательно масштабе очень хорошо - с использованием += наращивать результат в цикле является неэффективной, и в PyMeld % оператора медленнее, чем Python встроенные в одном. См. toFormatString() в справочном руководстве для способов ускорить этот вид кода.

Элемент содержания

При обращении к имени элемента в документе, вы получаете Meld объект, представляющий собой весь элемент:

>>> page = Meld('<html><span id="x">Hello world</span></html>')

>>> print page.x

<span id="x">Hello world</span>

Если вы просто хотите получить содержание элемента в виде строки, используйте _content атрибута:

>>> print page.x._content

Hello world

Вы можете также назначить в _content, хотя это прямо эквивалентно назначению tag:

>>> page.x._content = "Hello again"

>>> print page

<html><span id="x">Hello again</span></html>

>>> page.x = "Goodbye"

>>> print page

<html><span id="x">Goodbye</span></html>

Единственный раз, когда вам нужно обратиться к _content, это когда вы взяли ссылку на элемент в документе:

>>> x = page.x

>>> x._content = "I'm back"

>>> print page

<html><span id="x">I'm back</span></html>

Говоря x = "I'm back"просто повторно свяжите x в строку "I'm back" без ущерба для документа.

Версии и лицензии

Это версия 2.1.4 от PyMeld.py, Copyright (C) 2002-2009 Entrian Solutions. Open Source программное обеспечение, распространяется на условиях лицензии MIT.