Введение
Aspose.HTML FOSS для Python — это новая открытая библиотека для работы с документами HTML в Python. Она разбирает разметку в основанную на стандартах объектную модель документа, позволяет программно создавать и изменять деревья элементов и вычисляет CSS— включая специфичность, встроенные декларации и наследование— в вычисленные стили, которые можно прочитать из любого элемента.
Библиотека ориентирована на сценарии бэкенда и инструментов, где браузер недоступен или нежелателен: сервисы, очищающие хранимый HTML, конвейеры, перестраивающие фрагменты страниц, и наборы тестов, проверяющие сгенерированную разметку. Устанавливается из PyPI как aspose-html-foss, имеет MIT-лицензию и реализована на чистом Python для Python3.10 и новее, поэтому работает одинаково на машинах разработчиков, CI-раннерах и серверах.
Помимо ядра DOM и CSS, пакет поставляется с практичными строительными блоками, которые обычно требуются при обработке HTML: токенизатор и построитель дерева HTML, которым можно управлять напрямую, классы URL и URLSearchParams в стиле WHATWG, а также детектор кодировки потоков байтов.
Что включено
Создание и изменение DOM
Слой DOM построен вокруг Document, Element и Node. Создавайте элементы с помощью Document.create_element(), соединяйте их с помощью append_child(), задавайте атрибуты разметки с помощью Element.set_attribute() и снова ищите узлы с помощью Document.get_element_by_id(). Полные страницы и фрагменты разбираются через HTMLDocument.parse() и HTMLDocument.parse_fragment().
from aspose_html.dom import Document
doc = Document()
el = doc.create_element("div")
el.set_attribute("class", "foo")
el.set_attribute("id", "bar")
doc.append_child(el)
Применить таблицы стилей и прочитать вычисленные стили
CSSStyleSheet.replace_sync() разбирает текст таблицы стилей, Document.attach_style_sheet() приводит её в действие, а Element.get_computed_style() разрешает каскад. Результат учитывает специфичность селекторов — здесь правило ID побеждает правило класса:
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)
style = el.get_computed_style()
print(style.get_property_value("color"))
Встроенные декларации и каскад
Каждый элемент предоставляет живой CSSStyleDeclaration через своё свойство style. Встроенные декларации, установленные с помощью set_property(), обладают большей специфичностью, чем правила таблиц стилей автора, и get_computed_style() это отражает:
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"))
Токенизатор и построитель дерева
Когда вам требуется больше контроля, чем предоставляет готовое дерево, нижние уровни являются публичными API. Tokenizer.tokenize() и Tokenizer.tokenize_fragment() генерируют поток токенов для куска разметки, TreeBuilder.run() выполняет построение дерева в соответствии со стандартами, а функция parse_html() преобразует разметку в дерево за один вызов. Это те же компоненты, которые использует высокоуровневый путь парсинга.
URL-адреса и кодировки символов
URL.parse() и URL.can_parse() обрабатывают парсинг и валидацию URL в стиле WHATWG, с URLSearchParams (append(), get(), has(), delete()) для строк запроса. Для необработанных байтов detect_encoding() определяет кодировку — включая метки порядка байтов — и возвращает декодированный текст вместе с уровнем уверенности, в то время как get_canonical_name() нормализует метки кодировок:
from aspose_html.encoding.detection import detect_encoding
result = detect_encoding(b"\xef\xbb\xbf<p>x</p>")
print(result.encoding)
print(result.confidence)
print(result.text)
Быстрый старт
Установить из PyPI:
asposefoss/html is not yet published — build from source until it ships. See the project README for build instructions.Затем создайте документ, оформите его и прочитайте вычисленный результат:
from aspose_html.dom import Document
from aspose_html.cssom import CSSStyleSheet
doc = Document()
el = doc.create_element("div")
el.set_attribute("id", "bar")
doc.append_child(el)
sheet = CSSStyleSheet()
sheet.replace_sync("#bar { color: blue }")
doc.attach_style_sheet(sheet)
style = el.get_computed_style()
print(style.get_property_value("color"))
Открытый исходный код и лицензирование
Aspose.HTML FOSS для Python выпущен под лицензией MIT, поэтому коммерческое использование, модификация и распространение разрешены. Исходный код доступен на GitHub, а пакет опубликован на PyPI как aspose-html-foss.