Введение

Большинство инструментов HTML останавливаются на дереве. Aspose.HTML FOSS для Python идет на один уровень дальше: он реализует объектную модель CSS, поэтому таблица стилей — это не просто текст, который вы переносите — она участвует в реальном каскаде, и каждый элемент может сообщить вам стиль, который в итоге у него получился.

Это глубокое погружение охватывает уровень CSSOM: разбор таблиц стилей с помощью CSSStyleSheet, редактирование деклараций через CSSStyleDeclaration и чтение результатов обратно с помощью Element.get_computed_style() — включая то, как взаимодействуют специфичность, !important и наследование. Библиотека размещена на PyPI как aspose-html-foss, имеет лицензию MIT и написана полностью на Python (3.10+), что делает её практичной для проверки стилей в тестовых наборах и сервисах, где безголовый браузер был бы избыточным.


Ключевые возможности

Разбор и привязка таблиц стилей

CSSStyleSheet.replace_sync() разбирает текст таблицы стилей на месте; Document.attach_style_sheet() регистрирует лист в документе, чтобы он участвовал в каскаде. Таблицы стилей также могут быть построены правило за правилом с помощью insert_rule(), add_rule() и remove_rule(), или созданы из текста с помощью from_text():

from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet
doc = Document()
sheet = CSSStyleSheet()
sheet.replace_sync("div { color: red }")
doc.attach_style_sheet(sheet)

Специфичность определяет победителя

Когда несколько правил нацелены на один и тот же элемент, вычисленное значение определяется специфичностью селектора. Селектор ID (специфичность 1,0,0) превалирует над селектором класса (0,1,0):

from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet
doc = Document()
el = doc.create_element("div")
el.set_attribute("class", "foo")
el.set_attribute("id", "bar")
doc.append_child(el)
sheet = CSSStyleSheet()
sheet.replace_sync(".foo { color: red } #bar { color: blue }")
doc.attach_style_sheet(sheet)
print(el.get_computed_style().get_property_value("color"))

Встроенные объявления и CSSStyleDeclaration

Свойство style каждого элемента является живым CSSStyleDeclaration. Объявления редактируются с помощью set_property() и просматриваются с помощью get_property_value(), get_property_priority() и item(). Встроенные объявления имеют специфичность (1,0,0), поэтому они превосходят правила типов и классов из таблиц стилей автора:

from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet
doc = Document()
el = doc.create_element("div")
doc.append_child(el)
sheet = CSSStyleSheet()
sheet.replace_sync("div { color: red }")
doc.attach_style_sheet(sheet)
inline = el.style
inline.set_property("color", "blue")
print(el.get_computed_style().get_property_value("color"))

Важность превалирует над специфичностью

!important меняет обычный результат: правило автора, помеченное !important, превосходит неважное встроенное объявление, независимо от специфичности. Приоритеты также можно задать программно с помощью set_property_priority():

from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet
doc = Document()
el = doc.create_element("div")
doc.append_child(el)
sheet = CSSStyleSheet()
sheet.replace_sync("div { color: red !important }")
doc.attach_style_sheet(sheet)
inline = el.style
inline.set_property("color", "blue")
print(el.get_computed_style().get_property_value("color"))

Наследование и ключевое слово inherit

Наследуемые свойства, такие как color, передаются от родителя к потомку, если у потомка нет собственного локального значения — локальное правило всегда переопределяет унаследованное. Явное ключевое слово inherit копирует вычисленное значение родителя, а у корневого элемента без родителя оно возвращается к начальному значению свойства:

from aspose_html.dom import Document
doc = Document()
el = doc.create_element("div")
doc.append_child(el)
inline = el.style
inline.set_property("color", "inherit")
print(el.get_computed_style().get_property_value("color"))

Быстрый старт

Установить из PyPI:

git clone https://github.com/aspose-html-foss/Aspose.HTML-FOSS-for-Python.git
cd Aspose.HTML-FOSS-for-Python
pip install -e .

Разрешить конфликт из трёх источников — правило класса vs. правило ID vs. встроенное объявление:

from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet

doc = Document()
el = doc.create_element("div")
el.set_attribute("class", "foo")
el.set_attribute("id", "bar")
doc.append_child(el)

sheet = CSSStyleSheet()
sheet.replace_sync(".foo { color: red } #bar { color: green }")
doc.attach_style_sheet(sheet)

inline = el.style
inline.set_property("color", "blue")

print(el.get_computed_style().get_property_value("color"))

Открытый исходный код и лицензирование

Aspose.HTML FOSS для Python распространяется под лицензией MIT — коммерческое использование, модификация и перераспространение разрешены. Исходный код находится на GitHub, а релизы выпускаются для PyPI как aspose-html-foss.


Начало работы

Связанные ресурсы