Извлечь данные из HTML#
Установите HTML extra:
uv add "eazy-sdk-core[html]"
CSS(...) связывает поле модели с селектором документа. Операция остаётся обычным HTTP GET:
# examples/docs/integration_html_document.py
@dataclass(frozen=True, slots=True)
class InboxPage:
title: Annotated[str, CSS("h1::text")]
subject: Annotated[str, CSS("article .subject::text")]
@dataclass(frozen=True, slots=True)
class GetInbox(HttpOperation[InboxPage]):
__http__ = Http.get("/catalogue")
class InboxApi(SyncApi):
get = op(GetInbox)
Файл целиком
"""Extract a typed model from an HTML response."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Annotated
from eazy_sdk_html import CSS
from eazy_sdk import Http, HttpOperation, SyncApi, op
from .guide_site import GuideSite, guide_client
# docs:integration-html-document:start
# examples/docs/integration_html_document.py
@dataclass(frozen=True, slots=True)
class InboxPage:
title: Annotated[str, CSS("h1::text")]
subject: Annotated[str, CSS("article .subject::text")]
@dataclass(frozen=True, slots=True)
class GetInbox(HttpOperation[InboxPage]):
__http__ = Http.get("/catalogue")
class InboxApi(SyncApi):
get = op(GetInbox)
# docs:integration-html-document:end
def main() -> None:
with guide_client(GuideSite()) as client:
page = InboxApi(client).get()
print(f"html: {page.title} — {page.subject}")
if __name__ == "__main__":
main()
html: Входящие — План на пятницу
ParselBackend поддерживает CSS и XPath для text/html и application/xhtml+xml. Scope(...)
задаёт повторяющийся узел для списка вложенных моделей. Отсутствие обязательного поля считается
ошибкой разбора, а optional-поле получает None.
Примечание
Документная модель должна иметь хотя бы одно обязательное поле. Иначе она совпадёт с любой HTML- страницей, включая страницу ошибки другого ответа.