Извлечь данные из 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- страницей, включая страницу ошибки другого ответа.

Дальше#