{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3d9cb929",
   "metadata": {},
   "source": [
    "# 22-08 · Разбор URL\n",
    "\n",
    "Практика к разделу [«URL: домен, путь, параметры и фрагмент»](../../site/chapters/glava-22/22-08-url-anatomiya.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26287a32",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Разобрать URL на части модулем urllib.parse из стандартной библиотеки Python и убедиться, что фрагмент не попадает в путь и в query."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87e18bce",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f304e9cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "from urllib.parse import urlparse, parse_qs\n",
    "\n",
    "url = \"https://example.com:443/products/42?sort=price&page=2#details\"\n",
    "razobrannyj = urlparse(url)\n",
    "\n",
    "print(\"схема:\", razobrannyj.scheme)\n",
    "print(\"хост:\", razobrannyj.hostname)\n",
    "print(\"порт:\", razobrannyj.port)\n",
    "print(\"путь:\", razobrannyj.path)\n",
    "print(\"query:\", razobrannyj.query)\n",
    "print(\"фрагмент:\", razobrannyj.fragment)\n",
    "print(\"параметры:\", parse_qs(razobrannyj.query))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99483720",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8063c7a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert razobrannyj.scheme == \"https\"\n",
    "assert razobrannyj.hostname == \"example.com\"\n",
    "assert razobrannyj.port == 443\n",
    "assert razobrannyj.path == \"/products/42\"\n",
    "assert razobrannyj.fragment == \"details\"\n",
    "assert parse_qs(razobrannyj.query) == {\"sort\": [\"price\"], \"page\": [\"2\"]}\n",
    "print(\"Верно: URL разобран по частям, фрагмент отдельно от query.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61938869",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика\n",
    "\n",
    "Разберите адрес `http://localhost:5000/api/tasks?done=0` и проверьте, что путь равен `/api/tasks`, а параметр `done` равен `[\"0\"]`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1c0782a",
   "metadata": {},
   "outputs": [],
   "source": [
    "url2 = \"http://localhost:5000/api/tasks?done=0\"\n",
    "razobrannyj2 = urlparse(url2)\n",
    "parametry2 = parse_qs(razobrannyj2.query)\n",
    "\n",
    "assert razobrannyj2.path == \"/api/tasks\"\n",
    "assert parametry2[\"done\"] == [\"0\"]\n",
    "print(\"Верно: путь и параметр разобраны правильно.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
