Какой самый Pythonic XHTML / HTML модуль синтаксического анализа / генератора / шаблона поддерживает DOM-подобный доступ? - PullRequest
8 голосов
/ 17 ноября 2009

Должно быть в состоянии создавать , изменять и читать X / HTML в объектно-ориентированном способе, который все еще чувствует DOM нравится, но не страдает ожирением, и действительно Pythonic . Желательно, чтобы он также работал с некорректным HTML, но мы можем пропустить это для шаблонов.

Например, я хотел бы сделать это:

>> from someAmazingTemplate import *
>> html = Template('<html><head><title>Hi</title></head><body></body></html>')
>> html.head.append('<link type="text/css" href="main.css" rel="stylesheet" />')
>> html.head.title
Hi
>> html['head']['title']
Hi

Я должен иметь возможность использовать / определять короткие функции и использовать их следующим образом:

>> html.head.append(stylesheet(href="main.css"))
>> html.body.append(h1('BIG TITLE!12',Class="roflol"))
>> html.body.SOURCE
<body>
    <h1 class="roflol">
        BIG TITLE!12
    </h1>
</body>

Примечание: если он не существует, я собираюсь сделать это под лицензией BSD / MIT / Python. Помощь приветствуется. Все, что работает в направлении разработки веб-приложений на Pythonic, будет великолепным. Очень ценю это!

-Льюк Стэнли

Ответы [ 2 ]

5 голосов
/ 17 ноября 2009

Первая часть по большей части может быть сделана с помощью ElementTree , но требуется еще несколько шагов:

>>> import xml.etree.ElementTree as ET
>>> html = ET.XML('<html><head><title>Hi</title></head><body></body></html>')
>>> html.head = html.find('head')
>>> html.head.append(ET.XML('<link type="text/css" href="main.css" rel="stylesheet" />'))
>>> html.head.title = html.head.find('title')
>>> html.head.title.text
'Hi'

Вторая часть может быть завершена созданием объектов Element, но вам нужно будет выполнить некоторые из ваших собственных работ, чтобы это произошло так, как вы действительно хотите:

>>> html.body = html.find('body')
>>> my_h1 = ET.Element('h1', {'class': 'roflol'})
>>> my_h1.text = 'BIG TITLE!12'
>>> html.body.append(my_h1)
>>> html.body.SOURCE = ET.tostring(html.body)
>>> html.body.SOURCE
'<body><h1 class="roflol">BIG TITLE!12</h1></body>'

Вы можете создать собственную функцию stylesheet:

>>> def stylesheet(href='', type='text/css', rel='stylesheet', **kwargs):
...     elem = ET.Element('link', href=href, type=type, rel=rel) 
...     return elem
... 
>>> html.head.append(stylesheet(href="main.css"))

И весь документ:

>>> ET.tostring(html)
<html><head><title>Hi</title><link href="main.css" rel="stylesheet" type="text/css" /></head><body><h1 class="roflol">BIG TITLE!12</h1></body></html>

Но, я думаю, если вы собираетесь написать свою собственную вещь, это хорошее место для начала. ElementTree очень мощный.

Редактировать: Я понимаю, что это, вероятно, не совсем то, что вы ищете. Я просто хотел предоставить что-то в качестве доступной альтернативы, а также доказать, что это действительно можно сделать без особых усилий.

1 голос
/ 17 ноября 2009

Amara Bindery предоставляет самый Pythonic XML API, который я когда-либо видел. См. Краткий справочник , , руководство и faq

...