跳转到主要内容

Dominate是一个Python库,用于使用优雅的DOM API创建和操作HTML文档。

项目描述

Dominate

Dominate是一个Python库,用于使用优雅的DOM API创建和操作HTML文档。它允许您用纯Python非常简洁地编写HTML页面,从而消除了学习另一种模板语言的需求,并让您利用Python更强大的功能。

Python version Build status Coverage status

Python

import dominate
from dominate.tags import *

doc = dominate.document(title='Dominate your HTML')

with doc.head:
    link(rel='stylesheet', href='style.css')
    script(type='text/javascript', src='script.js')

with doc:
    with div(id='header').add(ol()):
        for i in ['home', 'about', 'contact']:
            li(a(i.title(), href='/%s.html' % i))

    with div():
        attr(cls='body')
        p('Lorem ipsum..')

print(doc)

输出

<!DOCTYPE html>
<html>
  <head>
    <title>Dominate your HTML</title>
    <link href="style.css" rel="stylesheet">
    <script src="script.js" type="text/javascript"></script>
  </head>
  <body>
    <div id="header">
      <ol>
        <li>
          <a href="/home.html">Home</a>
        </li>
        <li>
          <a href="/about.html">About</a>
        </li>
        <li>
          <a href="/contact.html">Contact</a>
        </li>
      </ol>
    </div>
    <div class="body">
      <p>Lorem ipsum..</p>
    </div>
  </body>
</html>

安装

安装dominate的推荐方式是使用pip

pip install dominate

PyPI version PyPI downloads

开发人员

Git仓库位于github.com/Knio/dominate

示例

所有示例都假设您已导入适当的标签或整个标签集

from dominate.tags import *

你好,世界!

dominate 的最基本功能是暴露一个用于每个 HTML 元素的类,其构造函数接受子元素、文本或关键字属性。 dominate 节点从 __str____unicode__render() 方法返回其 HTML 表示。

print(html(body(h1('Hello, World!'))))
<html>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>

属性

Dominate 还可以使用关键字参数将属性附加到您的标签上。大多数属性直接来自 HTML 规范,略有变化。

对于与 Python 的 保留关键字 冲突的属性 classfor,您可以使用以下别名

class for
_class _for
cls fr
className htmlFor
class_name html_for
test = label(cls='classname anothername', fr='someinput')
print(test)
<label class="classname anothername" for="someinput"></label>

使用 data_* 附加 自定义 HTML5 数据属性

test = div(data_employee='101011')
print(test)
<div data-employee="101011"></div>

您还可以通过类似于字典的界面修改标签的属性

header = div()
header['id'] = 'header'
print(header)
<div id="header"></div>

复杂结构

通过使用 += 运算符和 .add() 方法,您可以轻松创建更高级的结构。

创建一个简单的列表

list = ul()
for item in range(4):
    list += li('Item #', item)
print(list)
<ul>
    <li>Item #0</li>
    <li>Item #1</li>
    <li>Item #2</li>
    <li>Item #3</li>
</ul>

dominate 支持可迭代对象以帮助简化您的代码

print(ul(li(a(name, href=link), __pretty=False) for name, link in menu_items))
<ul>
    <li><a href="/home/">Home</a></li>
    <li><a href="/about/">About</a></li>
    <li><a href="/downloads/">Downloads</a></li>
    <li><a href="/links/">Links</a></li>
</ul>

一个简单的文档树

_html = html()
_body = _html.add(body())
header  = _body.add(div(id='header'))
content = _body.add(div(id='content'))
footer  = _body.add(div(id='footer'))
print(_html)
<html>
    <body>
        <div id="header"></div>
        <div id="content"></div>
        <div id="footer"></div>
    </body>
</html>

为了编写干净的代码,.add() 方法将子元素以元组的形式返回。上述示例可以整理和扩展如下

_html = html()
_head, _body = _html.add(head(title('Simple Document Tree')), body())
names = ['header', 'content', 'footer']
header, content, footer = _body.add([div(id=name) for name in names])
print(_html)
<html>
    <head>
       <title>Simple Document Tree</title>
    </head>
    <body>
        <div id="header"></div>
        <div id="content"></div>
        <div id="footer"></div>
    </body>
</html>

您可以通过类似于字典的界面修改标签的属性

header = div()
header['id'] = 'header'
print(header)
<div id="header"></div>

或通过数组行界面修改标签的子元素

header = div('Test')
header[0] = 'Hello World'
print(header)
<div>Hello World</div>

也可以使用对象创建注释!

print(comment('BEGIN HEADER'))
<!--BEGIN HEADER-->
print(comment(p('Upgrade to newer IE!'), condition='lt IE9'))
<!--[if lt IE9]>
  <p>Upgrade to newer IE!</p>
<![endif]-->

渲染

默认情况下,render() 尝试使所有输出易于阅读,每个 HTML 元素一行,缩进两个空格。

此行为可以通过创建元素时使用的 __pretty(默认:True,但某些元素类型如 pre 除外)属性控制,以及通过传递给 render()pretty(默认:True)、indent(默认: )和 xhtml(默认:False)参数控制。渲染选项会传播到所有子节点。

a = div(span('Hello World'))
print(a.render())
<div>
  <span>Hello World</span>
</div>
print(a.render(pretty=False))
<div><span>Hello World</span></div>
print(a.render(indent='\t'))
<div>
	<span>Hello World</span>
</div>
a = div(span('Hello World'), __pretty=False)
print(a.render())
<div><span>Hello World</span></div>
d = div()
with d:
    hr()
    p("Test")
    br()
print(d.render())
print(d.render(xhtml=True))
<div>
  <hr>
  <p>Test</p><br>
</div>
<div>
  <hr />
  <p>Test</p><br />
</div>

上下文管理器

您还可以使用 Python 的 with 语句添加子元素

h = ul()
with h:
    li('One')
    li('Two')
    li('Three')

print(h)
<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

您可以将此与添加子元素的其他机制一起使用,包括嵌套 with 语句,并且它将按预期工作

h = html()
with h.add(body()).add(div(id='content')):
    h1('Hello World!')
    p('Lorem ipsum ...')
    with table().add(tbody()):
        l = tr()
        l += td('One')
        l.add(td('Two'))
        with l:
            td('Three')

print(h)
<html>
    <body>
        <div id="content">
            <h1>Hello World!</h1>
            <p>Lorem ipsum ...</p>
            <table>
                <tbody>
                    <tr>
                        <td>One</td>
                        <td>Two</td>
                        <td>Three</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

当上下文关闭时,任何尚未添加到某处的节点将添加到当前上下文。

可以使用 attr 函数将属性添加到当前上下文

d = div()
with d:
    attr(id='header')

 print(d)
<div id="header"></div>

并且可以使用 dominate.util.text 函数添加文本节点

from dominate.util import text
para = p(__pretty=False)
with para:
    text('Have a look at our ')
    a('other products', href='/products')

print(para)
<p>Have a look at our <a href="/products">other products</a></p>

装饰器

Dominate 对于创建页面的部分可重用小部件非常出色。考虑以下示例

def greeting(name):
    with div() as d:
        p('Hello, %s' % name)
    return d

print(greeting('Bob'))
<div>
    <p>Hello, Bob</p>
</div>

您可以看到以下模式在这里被重复使用

def widget(parameters):
    with tag() as t:
        ...
    return t

可以使用标签(对象和实例)作为装饰器来避免此样板代码

@div
def greeting(name):
    p('Hello %s' % name)
print(greeting('Bob'))
<div>
    <p>Hello Bob</p>
</div>

装饰的函数将返回用于装饰它的标签的新实例,并在 with 上下文中执行,该上下文将收集其内部创建的所有节点。

如果您需要向小部件的根节点添加属性或其他数据,您还可以使用标签的实例作为装饰器。装饰函数的每次调用都将返回用于装饰它的节点的副本。

@div(h2('Welcome'), cls='greeting')
def greeting(name):
    p('Hello %s' % name)

print(greeting('Bob'))
<div class="greeting">
    <h2>Welcome</h2>
    <p>Hello Bob</p>
</div>

创建文档

由于每次创建 HTML 文档的常见结构都会非常繁琐,dominate 提供了一个用于创建和管理这些结构的类:document

创建新文档时,会为您创建基本的 HTML 标签结构。

d = document()
print(d)
<!DOCTYPE html>
<html>
    <head>
       <title>Dominate</title>
    </head>
    <body></body>
</html>

document 类接受 titledoctyperequest 关键字参数。这些参数的默认值分别为 Dominate<!DOCTYPE html>None

document 类还提供了助手函数,允许您直接访问 titleheadbody 节点。

d = document()
>>> d.head
<dominate.tags.head: 0 attributes, 1 children>
>>> d.body
<dominate.tags.body: 0 attributes, 0 children>
>>> d.title
u'Dominate'

document 类还提供了助手函数,允许您直接将节点添加到 body 标签中。

d = document()
d += h1('Hello, World!')
d += p('This is a paragraph.')
print(d)
<!DOCTYPE html>
<html>
    <head>
       <title>Dominate</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
        <p>This is a paragraph.</p>
    </body>
</html>

嵌入 HTML

如果您需要嵌入来自 markdown 等库的预格式化 HTML 节点,可以使用 dominate.util 包中的 raw 方法来避免转义 HTML。

from dominate.util import raw
...
td(raw('<a href="example.html">Example</a>'))

如果没有使用 raw 调用,此代码将渲染转义后的 HTML,例如 lt 等。

SVG

dominate.svg 模块包含类似于 dominate.tags 包含 HTML 标签的 SVG 标签。SVG 元素会自动将 _ 转换为 - 以便用于虚线元素。例如

from dominate.svg import *
print(circle(stroke_width=5))
<circle stroke-width="5"></circle>

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

dominate-2.9.1.tar.gz (37.7 kB 查看散列)

上传时间

构建分发

dominate-2.9.1-py2.py3-none-any.whl (30.0 kB 查看散列)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面