Как работать с CSS селекторами в Python

Как работать с CSS селекторами в Python

Селекторный движок в Aspose.HTML FOSS для Python оценивает селекторы классов, идентификаторов, типов, атрибутов и псевдоклассов с учётом специфичности по стандартам. Это руководство демонстрирует сопоставление селекторов через каскад — тот же движок, который используется в select() и element_matches() — с использованием pip для установки.

Пошаговое руководство

Шаг 1: Установите пакет

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

Шаг 2: Импортируйте необходимые классы

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

Шаг 3: Создайте элемент, соответствующий нескольким селекторам

Элемент, имеющий одновременно класс и id, одновременно совпадает с селекторами .foo, #bar и div:

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

Шаг 4: Позвольте специфичности решить

Присоедините конфликтующие правила — (1,0,0) селектора ID побеждает (0,1,0) селектора класса:

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"))

Шаг 5: Переопределить с помощью встроенного объявления

Встроенные объявления имеют приоритет (1,0,0) на уровне inline и превосходят правила автора любой специфичности селектора:

inline = el.style
inline.set_property("color", "green")
print(el.get_computed_style().get_property_value("color"))

Распространённые проблемы и решения

Селектор, который выглядит правильным, не совпадает ни с чем. Текст селектора с синтаксическими ошибками не проходит парсинг — движок сообщает об этом, а не пытается угадывать; проверьте строку селектора.

:where() ведёт себя иначе, чем :is(). Это задумано так: :where() вносит нулевую специфичность, :is() вносит специфичность её аргумента.

Селектор типа неожиданно проигрывает. Селекторы типа имеют самый низкий класс специфичности (0,0,1); любое правило класса или id на том же элементе имеет более высокий приоритет.

Часто задаваемые вопросы

Могу ли я выполнить запрос селектора без таблицы стилей?

Да — select() оценивает селектор непосредственно против дерева, а element_matches() проверяет отдельный элемент.

Как вычисляется специфичность?

specificity() возвращает стандартный кортеж (id, class, type), используемый как в запросах, так и в каскаде.

Какие псевдоклассы моделируются?

Существуют структурированные формы для :is(), :where(), :has(), :not() со сложными аргументами и селекторами в стиле nth-child.

См. также:

 Русский