PyMeld
Простая и легкая система для работы с 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.