Dominate是一个Python库,用于使用优雅的DOM API创建和操作HTML文档。
项目描述
Dominate
Dominate
是一个Python库,用于使用优雅的DOM API创建和操作HTML文档。它允许您用纯Python非常简洁地编写HTML页面,从而消除了学习另一种模板语言的需求,并让您利用Python更强大的功能。
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
开发人员
- Tom Flanagan - tom@zkpq.ca
- Jake Wharton - jakewharton@gmail.com
- Brad Janke
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 的 保留关键字 冲突的属性 class
和 for
,您可以使用以下别名
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
类接受 title
、doctype
和 request
关键字参数。这些参数的默认值分别为 Dominate
、<!DOCTYPE html>
和 None
。
document
类还提供了助手函数,允许您直接访问 title
、head
和 body
节点。
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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 558284687d9b8aae1904e3d6051ad132dd4a8c0cf551b37ea4e7e42a31d19dc4 |
|
MD5 | 4dc4bbb39297999624e2312b6fe2b46f |
|
BLAKE2b-256 | fbf31c8088ff19a0fcd9c3234802a0ee47006ea64bd8852f1019194f0e3583ff |
dominate-2.9.1-py2.py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | cb7b6b79d33b15ae0a6e87856b984879927c7c2ebb29522df4c75b28ffd9b989 |
|
MD5 | 0f39082845ae840319a5addf1c43e43c |
|
BLAKE2b-256 | 58190380af745f151a1648657bbcef0fb49ac28bf09083d94498163ffd9b32dc |