Как работать с 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.