跳转到主要内容

将CSS内联到HTML 'style'属性的快速库

项目描述

css_inline

build status pypi versions license codecov.io gitter

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倍
  • 内联来自 stylelink 标签的CSS
  • 删除 stylelink 标签
  • 解析外部样式表(包括本地文件)
  • 可选地缓存外部样式表
  • 可以并行处理多个文档
  • 在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会自动添加缺少的htmlbody标签,因此输出是有效的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_manyinline_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"属性还允许您跳过linkstyle标签

<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.tar.gz (60.0 kB 查看哈希值)

上传时间

构建分布

css_inline-0.14.1-pp310-pypy310_pp73-manylinux_2_24_x86_64.whl (1.8 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ x86-64

css_inline-0.14.1-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl (1.7 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ ARM64

css_inline-0.14.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl (1.7 MB 查看哈希值)

上传时间 PyPy macOS 10.12+ x86-64

css_inline-0.14.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl (1.8 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ x86-64

css_inline-0.14.1-pp39-pypy39_pp73-manylinux_2_24_aarch64.whl (1.7 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ ARM64

css_inline-0.14.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl (1.7 MB 查看哈希值)

上传时间 PyPy macOS 10.12+ x86-64

css_inline-0.14.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl (1.8 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ x86-64

css_inline-0.14.1-pp38-pypy38_pp73-manylinux_2_24_aarch64.whl (1.7 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ ARM64

css_inline-0.14.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl (1.7 MB 查看哈希值)

上传时间 PyPy macOS 10.12+ x86-64

css_inline-0.14.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl (1.8 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ x86-64

css_inline-0.14.1-pp37-pypy37_pp73-manylinux_2_24_aarch64.whl (1.7 MB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.24+ ARM64

css_inline-0.14.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl (1.7 MB 查看哈希值)

上传时间 PyPy macOS 10.12+ x86-64

css_inline-0.14.1-cp37-abi3-win_amd64.whl (1.7 MB 查看哈希值)

上传时间 CPython 3.7+ Windows x86-64

css_inline-0.14.1-cp37-abi3-win32.whl (1.4 MB 查看哈希值)

上传时间: CPython 3.7+ Windows x86

css_inline-0.14.1-cp37-abi3-musllinux_1_2_x86_64.whl (1.9 MB 查看哈希值)

上传时间: CPython 3.7+ musllinux: musl 1.2+ x86-64

css_inline-0.14.1-cp37-abi3-musllinux_1_2_armv7l.whl (1.8 MB 查看哈希值)

上传时间: CPython 3.7+ musllinux: musl 1.2+ ARMv7l

css_inline-0.14.1-cp37-abi3-musllinux_1_2_aarch64.whl (1.9 MB 查看哈希值)

上传时间: CPython 3.7+ musllinux: musl 1.2+ ARM64

css_inline-0.14.1-cp37-abi3-manylinux_2_24_armv7l.whl (1.6 MB 查看哈希值)

上传时间: CPython 3.7+ manylinux: glibc 2.24+ ARMv7l

css_inline-0.14.1-cp37-abi3-manylinux_2_24_aarch64.whl (1.7 MB 查看哈希值)

上传时间: CPython 3.7+ manylinux: glibc 2.24+ ARM64

css_inline-0.14.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.8 MB 查看哈希值)

上传时间: CPython 3.7+ manylinux: glibc 2.17+ x86-64

css_inline-0.14.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl (1.6 MB 查看哈希值)

上传时间: CPython 3.7+ manylinux: glibc 2.12+ i686

css_inline-0.14.1-cp37-abi3-macosx_10_12_x86_64.whl (1.7 MB 查看哈希值)

上传时间: CPython 3.7+ macOS 10.12+ x86-64

css_inline-0.14.1-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (3.2 MB 查看哈希值)

上传时间: CPython 3.7+ macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64

由以下支持

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