将CSS内联到HTML 'style'属性的快速库
项目描述
css_inline
css_inline
是一个将CSS内联到HTML 'style'属性的快速库。
该库适用于准备HTML邮件或嵌入第三方网页等场景。
例如,该库将HTML转换为以下形式
<html>
<head>
<style>h1 { color:blue; }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
</html>
到
<html>
<head></head>
<body>
<h1 style="color:blue;">Big Text</h1>
</body>
</html>
- 使用来自Mozilla Servo项目的可靠组件
- 比替代方案快10-400倍
- 内联来自
style
和link
标签的CSS - 删除
style
和link
标签 - 解析外部样式表(包括本地文件)
- 可选地缓存外部样式表
- 可以并行处理多个文档
- 在Linux、Windows和macOS上工作
- 支持HTML5 & CSS3
- 在CPython 3.7、3.8、3.9、3.10、3.11、3.12和PyPy 3.7、3.8、3.9、3.10上进行了测试。
沙箱
如果您想尝试 css-inline
,可以检查由WebAssembly支持的沙箱,以即时查看结果。
安装
使用 pip
安装
pip install css_inline
预编译的轮子适用于大多数流行的平台。如果您的平台不可用,则需要Rust编译器从源代码构建此包。需要Rust版本1.65或更高版本。
使用方法
import css_inline
HTML = """<html>
<head>
<style>h1 { color:blue; }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
</html>"""
inlined = css_inline.inline(HTML)
# HTML becomes this:
#
# <html>
# <head>
# <style>h1 { color:blue; }</style>
# </head>
# <body>
# <h1 style="color:blue;">Big Text</h1>
# </body>
# </html>
请注意,css-inline
会自动添加缺少的html
和body
标签,因此输出是有效的HTML文档。
或者,您可以将在HTML片段中内联CSS,保留原始结构
FRAGMENT = """<main>
<h1>Hello</h1>
<section>
<p>who am i</p>
</section>
</main>"""
CSS = """
p {
color: red;
}
h1 {
color: blue;
}
"""
inlined = css_inline.inline_fragment(FRAGMENT, CSS)
# HTML becomes this:
# <main>
# <h1 style="color: blue;">Hello</h1>
# <section>
# <p style="color: red;">who am i</p>
# </section>
# </main>
当需要同时内联多个HTML文档时,css_inline
提供了inline_many
和inline_many_fragments
函数。此功能允许同时处理多个输入,在处理大量文档时显著提高性能。
import css_inline
css_inline.inline_many(["<...>", "<...>"])
在底层,inline_many
在Rust层生成线程以处理输入的并行处理。这比在Python级别使用并行处理技术执行得更快。
注意:为了充分利用inline_many
,您应在多核机器上运行您的应用程序。
配置
使用CSSInliner
类进行配置选项
import css_inline
inliner = css_inline.CSSInliner(keep_style_tags=True)
inliner.inline("...")
inline_style_tags
。指定是否从“style”标签中内联CSS。默认:True
keep_style_tags
。指定是否在内联后保留“style”标签。默认:False
keep_link_tags
。指定是否在内联后保留“link”标签。默认:False
base_url
。用于解析相对URL的基本URL。如果您想从文件系统加载样式表,请使用file://
方案。默认:None
load_remote_stylesheets
。指定是否加载远程样式表。默认:True
cache
。指定外部样式表的缓存选项(例如,StylesheetCache(size=5)
)。默认:None
extra_css
。要内联的额外CSS。默认:None
preallocate_node_capacity
。高级。在解析期间预分配HTML节点容量。如果您对HTML文档中的节点数有估计,这可以提高性能。默认:32
您还可以通过向HTML标签添加data-css-inline="ignore"
属性来跳过该标签的CSS内联
<head>
<style>h1 { color:blue; }</style>
</head>
<body>
<!-- The tag below won't receive additional styles -->
<h1 data-css-inline="ignore">Big Text</h1>
</body>
data-css-inline="ignore"
属性还允许您跳过link
和style
标签
<head>
<!-- Styles below are ignored -->
<style data-css-inline="ignore">h1 { color:blue; }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
或者,您可以使用data-css-inline="keep"
属性保留style
不被删除。如果您想将响应式电子邮件的@media
查询保留在单独的style
标签中,这很有用
<head>
<!-- Styles below are not removed -->
<style data-css-inline="keep">h1 { color:blue; }</style>
</head>
<body>
<h1>Big Text</h1>
</body>
即使将keep_style_tags
选项设置为false
,这些标签也会保留在生成的HTML中。
如果您想从文件系统加载样式表,请使用file://
方案
import css_inline
# styles/email is relative to the current directory
inliner = css_inline.CSSInliner(base_url="file://styles/email/")
inliner.inline("...")
您还可以将外部样式表缓存起来以避免过多的网络请求
import css_inline
inliner = css_inline.CSSInliner(
cache=css_inline.StylesheetCache(size=5)
)
inliner.inline("...")
默认情况下禁用缓存。
XHTML兼容性
如果您想解决一些XHTML兼容性问题,例如关闭空标签(<hr>
与<hr/>
),您可以使用涉及lxml
的以下代码片段
import css_inline
from lxml import html, etree
document = "..." # Your HTML document
inlined = css_inline.inline(document)
tree = html.fromstring(inlined)
inlined = etree.tostring(tree).decode(encoding="utf-8")
性能
css-inline
由Mozilla的Servo项目的有效工具支持,并且在速度方面显著优于其他Python替代方案。大多数时候,它比下一个最快的替代方案快超过10倍
。
以下是性能比较
大小 | css_inline 0.14.0 |
premailer 3.10.0 |
toronado 0.1.0 |
inlinestyler 0.2.5 |
pynliner 0.8.0 |
|
---|---|---|---|---|---|---|
基本 | 230 B | 6.79 µs | 130.25 µs (19.18倍 ) |
683.04 µs (100.58倍 ) |
1.06 ms (157.10倍 ) |
1.21ms (178.61倍 ) |
现实-1 | 8.58 KB | 135.37 µs | 1.40 ms (10.38倍 ) |
16.29 ms (120.37倍 ) |
26.64 ms (196.82倍 ) |
52.36 ms (386.85倍 ) |
Realistic-2 | 4.3 KB | 85.41 微秒 | 2.70 毫秒 (31.70倍) | 错误 | 17.57 毫秒 (205.73倍) | 错误 |
GitHub 页面 | 1.81 MB | 230.63 毫秒 | 24.32 秒 (105.45倍) | 错误 | 错误 | 错误 |
“基本”情况是通过基准测试使用“用法”部分的示例获得的。请注意,当使用“toronado”、“inlinestyler”和“pynliner”库在最后一种情况下内联CSS时,都遇到了错误。
基准测试代码位于“benches/bench.py”文件中。这些基准测试是在稳定版的“rustc 1.77.1”和Python 3.11.7
上进行的。
与其他库的比较
除了性能外,css-inline
与其他用于CSS内联的Python库也有所不同。
- 通常支持比其他库更多的CSS功能(例如,“toronado”和“pynliner”不支持伪元素);
- 配置选项较少,不如“premailer”灵活;
- 在比基于LXML的库(“premailer”、“inlinestyler”、“toronado”以及可选的“pynliner”)更少的平台上运行;
- 尚未提供调试日志;
- 仅支持HTML 5。
进一步阅读
如果您想了解这个库是如何创建的以及其内部工作原理,可以查看以下文章
许可证
本项目根据 MIT 许可证 许可。
项目详情
哈希值 用于 css_inline-0.14.1-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d1e6b348fc98eb6086c81d84619fc4db68534d32460382051de809d5bd83beea |
|
MD5 | 0e96353baa3ca02774f91c4007acdc8f |
|
BLAKE2b-256 | 971d71fa6054cbb743b96bf3b7b9e529c29b3ea1187055e814658050c477008e |
哈希值 用于 css_inline-0.14.1-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 776b2d228da427c22130f024aa3f824a7a459c5139b0a26a271747bbc7ed9cf2 |
|
MD5 | 1373eebcf6a172e5714e7b5a02b126e0 |
|
BLAKE2b-256 | a7e4ced62f5df04823c49e936cc11ec07310b35d8907548c9938130e1cc1b1c0 |
哈希值 用于 css_inline-0.14.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ab1ac4edcc8ccd69ac5b7e3f88689400cbdee79503512609a1519e744816bb80 |
|
MD5 | d346a0015ded67f19b8e864477994afe |
|
BLAKE2b-256 | 948b00c4634259da264bfa6f08edefaeae98997d595adafb4f138190ba9630cd |
哈希值 用于 css_inline-0.14.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 07245808f48332e0381fe12b9e9675ee4b61c8063abc6dc90b46393f89b3ef3f |
|
MD5 | f36d3a5d15414ce7376e3ff20743e959 |
|
BLAKE2b-256 | 78c3218c0c8fb2d7c282a5cd60a6fe477ea3861a33451351627f74d266283be3 |
哈希值 用于 css_inline-0.14.1-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5d14bf191e4df53a91b9608e767cf0eb41efd9b4b047f81dba88a755d9300497 |
|
MD5 | ee404937ffee5071653eeabc40019dd6 |
|
BLAKE2b-256 | f2f9dd44c8dd98be18ad2d9be1b31ce6f0ca6f946cf1cee4e84b5953d1be554c |
哈希值 用于 css_inline-0.14.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 11958f80f7001739af70cecc3ce5d34871579a76bcdbb9cb67be709bd4b68b15 |
|
MD5 | 95fb4ca9e08b2fef116cc8345263a3e1 |
|
BLAKE2b-256 | 731ef6a6182cbd5b80b7a712ba67b32e56ffb4917056a0e2abcf34f3bdcb1ffe |
哈希值 用于 css_inline-0.14.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8a82d7658524d2f6ef215e7054dd5efb01767877c02e63199aa0a6b94ea9dddc |
|
MD5 | 8ccff4f989171349f6ce3726cb39d206 |
|
BLAKE2b-256 | f5d77d98a5164caaff6b2fb7c473c4a4a441f16dcc32d3436797fdb4ce2aad32 |
哈希值 用于 css_inline-0.14.1-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1da8244e369906d74379bb50c0424df9d4f11a8eb17cfe7e254de7589254bfb3 |
|
MD5 | 805dce7a6773e50fe3c87e5449affc18 |
|
BLAKE2b-256 | c1ff514436f41675ff880b40004a08322d01d3098d92bded29e614e80dbad6d1 |
哈希值 用于 css_inline-0.14.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cda499277cd3866820efbd93440267028c0faeb57f02492d5e449a62dc0bf297 |
|
MD5 | 4d5e1d5c855e72f4209f109aa406f7ec |
|
BLAKE2b-256 | 848a8e7cd209a4d8478194d7431d5b7340de6d1684347cda7d6b9c8259f40550 |
哈希值 用于 css_inline-0.14.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4e6b175aca68b1063a820e3d2e2631646331b87caaa19d9c20fc4e638ca7c4b3 |
|
MD5 | 15440ebe6f70fe7ac7faf2aec6901aba |
|
BLAKE2b-256 | e463047253fce86bf1b9f046a557425dede0b98632c2cfa7e62a0cde40b1b4ee |
哈希值 用于 css_inline-0.14.1-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0b1dede818706207a3aff184073fc92caea0014f91d7ee497ca6bcf578c6d941 |
|
MD5 | 55140f48e504a196977828f4fa5f30da |
|
BLAKE2b-256 | d8064fe9c5bb58b559b6402d2480af7ccd03f59c99de580571063f108ca11db1 |
哈希值 用于 css_inline-0.14.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ebc56162752a5dd1d5d64c57e61b06efba42add243a8f900f465276cf0207930 |
|
MD5 | 291607d7a1c3e65d228ca382c338fa13 |
|
BLAKE2b-256 | 0a63ac3cc8b8196b3517d8e577bb726ced1e2e7c5240e1600ec074b4b1aeeb0d |
哈希值 for css_inline-0.14.1-cp37-abi3-musllinux_1_2_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fe163ec5504496cd842b5ed8da914033b93ede09a1c23b6322b5b0efe8d57499 |
|
MD5 | 551531ae06cdfe62e9f576144d214a72 |
|
BLAKE2b-256 | 664478fcc5ffa41f8ef806888c70b07c8eca9c12edadebf3a0d6bb1b7e0354b5 |
哈希值 for css_inline-0.14.1-cp37-abi3-musllinux_1_2_armv7l.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8841bc4f1eb64d502bcbde1367a75afcb28f9b70b8e3bf4effc2c5b6db10cfdc |
|
MD5 | c76882099221cf80e192172ea7b2b87f |
|
BLAKE2b-256 | ccc05a582c6d9b349e1f73a46b925361fcc895717d45037dcc7af00a458c8a9e |
哈希值 for css_inline-0.14.1-cp37-abi3-musllinux_1_2_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ee58ad5fd000526748db9851989b306a2e4cb84cc788bb784b4d9eb045286a8 |
|
MD5 | bdebb65b7e82c1b61495012817348a92 |
|
BLAKE2b-256 | 2793d91166bb4d1605684f420776765e4c996c7c29c6cfda1531f37f6e62b451 |
哈希值 for css_inline-0.14.1-cp37-abi3-manylinux_2_24_armv7l.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 56676cf0a113ec76f4d773206cafda05d7708d81004d8f952aaf40b7ad14aa99 |
|
MD5 | 272d6bd45a406f457c0b22e5f0b11ccf |
|
BLAKE2b-256 | 06b7efc10585fd993acc85fe9240c05350d3c6ffb4d511249beb1bee827222d7 |
哈希值 for css_inline-0.14.1-cp37-abi3-manylinux_2_24_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 56b63a535d78261b1205bf84e7c59abf7c20c5265a644171ff6e025e8933655b |
|
MD5 | ebd8decf0d610bccddc4163ae1678609 |
|
BLAKE2b-256 | ff8fc9018347a2273f331a2da22a09df7eea5b5024515a48c78c61b53b8bff13 |
哈希值 for css_inline-0.14.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8e07489135fc354bafe7ff0f417de1a0532927bdd25d66fd90bd09a47305d0de |
|
MD5 | b815102387c108c82d7b33cb7d4e71cb |
|
BLAKE2b-256 | aec921bb6894ad10a637bd3d2610842b0ab955cef6449606df2da3e7c4573119 |
哈希值 for css_inline-0.14.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 14ac1c24f312a9000d521ca914dab3c9c9281d08d41f0c4be9af40d217de57d1 |
|
MD5 | e4847f3529b8db0d35f2efea14638781 |
|
BLAKE2b-256 | c500b76dc0db6a6d3fb72d34f6085964428e2b7f5b17c0fcc2b09e9774925ce1 |
哈希值 for css_inline-0.14.1-cp37-abi3-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 901465d67691a68bf849966a9e986dc7dc87021321caf1e958e9c48c02bfae32 |
|
MD5 | f41cfa29a2924b91c49c5c03a6f7c26a |
|
BLAKE2b-256 | a97f178fdd4c609052d7977f917ea1845fd1a7b184f479e9786ac00722d69b9f |
哈希值 for css_inline-0.14.1-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c6a5c2691a17d4cfc2e2fcfa6c2c42cc72f44f06dc34f63d5b08ab21769035e5 |
|
MD5 | 36eaa5084a1d1877a82d3ec7ecf961c4 |
|
BLAKE2b-256 | f57eebaee0f1ec3f8bda1d08fcd07bfb8c1c79f876b8d912596e873dc89410ca |