{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ea4cdbaa",
   "metadata": {},
   "source": [
    "# جمع بيانات نظام العمل السعودي والأسئلة الشائعة — النسخة النهائية المعتمدة\n",
    "## Web Scraping + Cleaning + Final Saving for RAG Pipeline\n",
    "\n",
    "هذا النوتبوك مسؤول فقط عن **مرحلة السحب وحفظ البيانات الخام النظيفة**، حتى لا نعيد عملية السحب في كل نوتبوك لاحق.\n",
    "\n",
    "المخرجات النهائية التي تعتمدها بقية المراحل تحفظ داخل:\n",
    "\n",
    "```text\n",
    "saudi_labor_law_voice_agent_project/01_raw/\n",
    "```\n",
    "\n",
    "ويتم حفظ مصدرين:\n",
    "\n",
    "- مواد نظام العمل السعودي من موقع وزارة الموارد البشرية.\n",
    "- الأسئلة الشائعة FAQ مع فلاتر التصنيف من موقع الوزارة.\n",
    "\n",
    "> شغّل هذا النوتبوك مرة واحدة فقط عند الحاجة لتحديث البيانات من الموقع. بعد ذلك، نوتبوك المعالجة ونوتبوك RAG يقرؤون ملفات CSV المحفوظة مباشرة بدون إعادة Scraping.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fcc03545",
   "metadata": {},
   "source": [
    "## المرحلة 1: سحب مواد نظام العمل\n",
    "\n",
    "تستخرج كل مادة مع نصها ورقمها وبابها وفصلها.\n",
    "\n",
    "تتضمن محوّلاً يحوّل ترتيب المادة العربي إلى رقم صحيح، وتنتج المتغير df_labor_law."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "47a2d278",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "جاري استخراج روابط الأبواب...\n",
      "عدد الأبواب التي تم العثور عليها: 16\n",
      "- الباب الأول | التعريفات / الأحكام العامة\n",
      "- الباب الثاني | تنظيم عمليات التوظيف\n",
      "- الباب الثالث | توظيف غير السعوديين\n",
      "- الباب الرابع | التدريب والتأهيل\n",
      "- الباب الخامس | علاقات العمل\n",
      "- الباب السادس | شروط العمل وظروفه\n",
      "- الباب السابع | العمل لبعض الوقت\n",
      "- الباب الثامن | الوقاية من مخاطر العمل والوقاية من الحوادث الصناعية الكبرى وإصابات العمل والخدمات الصحية والاجتماعية\n",
      "- الباب التاسع | تشغيل النساء\n",
      "- الباب العاشر | تشغيل الأحداث\n",
      "- الباب الحادي عشر | عقد العمل البحري\n",
      "- الباب الثاني عشر | العمل في المناجم والمحاجر\n",
      "- الباب الثالث عشر | تفتيش العمل\n",
      "- الباب الرابع عشر | هيئات تسوية الخلافات العمالية\n",
      "- الباب الخامس عشر | العقوبات\n",
      "- الباب السادس عشر | أحكام ختامية\n",
      "\n",
      "جاري استخراج المواد من كل باب...\n",
      "سحب: الباب الأول - التعريفات / الأحكام العامة\n",
      "  تم استخراج 22 مادة\n",
      "سحب: الباب الثاني - تنظيم عمليات التوظيف\n",
      "  تم استخراج 10 مادة\n",
      "سحب: الباب الثالث - توظيف غير السعوديين\n",
      "  تم استخراج 10 مادة\n",
      "سحب: الباب الرابع - التدريب والتأهيل\n",
      "  تم استخراج 8 مادة\n",
      "سحب: الباب الخامس - علاقات العمل\n",
      "  تم استخراج 40 مادة\n",
      "سحب: الباب السادس - شروط العمل وظروفه\n",
      "  تم استخراج 30 مادة\n",
      "سحب: الباب السابع - العمل لبعض الوقت\n",
      "  تم استخراج 2 مادة\n",
      "سحب: الباب الثامن - الوقاية من مخاطر العمل والوقاية من الحوادث الصناعية الكبرى وإصابات العمل والخدمات الصحية والاجتماعية\n",
      "  تم استخراج 29 مادة\n",
      "سحب: الباب التاسع - تشغيل النساء\n",
      "  تم استخراج 12 مادة\n",
      "سحب: الباب العاشر - تشغيل الأحداث\n",
      "  تم استخراج 7 مادة\n",
      "سحب: الباب الحادي عشر - عقد العمل البحري\n",
      "  تم استخراج 17 مادة\n",
      "سحب: الباب الثاني عشر - العمل في المناجم والمحاجر\n",
      "  تم استخراج 9 مادة\n",
      "سحب: الباب الثالث عشر - تفتيش العمل\n",
      "  تم استخراج 16 مادة\n",
      "سحب: الباب الرابع عشر - هيئات تسوية الخلافات العمالية\n",
      "  تم استخراج 19 مادة\n",
      "سحب: الباب الخامس عشر - العقوبات\n",
      "  تم استخراج 15 مادة\n",
      "سحب: الباب السادس عشر - أحكام ختامية\n",
      "  تم استخراج 3 مادة\n",
      "\n",
      "فحص جودة مواد نظام العمل بعد التنظيف:\n",
      "عدد الصفوف قبل إزالة التكرار: 249\n",
      "عدد الصفوف بعد إزالة التكرار: 249\n",
      "عدد المواد: 245 | الأعلى: 245\n",
      "المفقود من 1 إلى 245: []\n",
      "عدد التكرارات حسب رقم المادة: 0\n",
      "عدد المواد بدون نص: 0\n",
      "توزيع حالة المواد:\n",
      "article_status\n",
      "active      211\n",
      "repealed     38\n",
      "Name: count, dtype: int64\n",
      "\n",
      "تم الانتهاء بنجاح\n",
      "عدد المواد النهائي: 249\n",
      "CSV  : saudi_labor_law_by_bab_articles.csv\n",
      "Excel: saudi_labor_law_by_bab_articles.xlsx\n",
      "JSON : saudi_labor_law_by_bab_articles.json\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bab_order</th>\n",
       "      <th>bab_label</th>\n",
       "      <th>bab_title</th>\n",
       "      <th>fasl</th>\n",
       "      <th>article_title</th>\n",
       "      <th>article_number</th>\n",
       "      <th>article_number_label</th>\n",
       "      <th>article_number_int</th>\n",
       "      <th>article_text</th>\n",
       "      <th>source_url</th>\n",
       "      <th>searchable_text</th>\n",
       "      <th>text_len</th>\n",
       "      <th>article_status</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الأول</td>\n",
       "      <td>المادة الأولى:</td>\n",
       "      <td>الأولى</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>يسمى هذا النظام نظام العمل.</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>27</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الأول</td>\n",
       "      <td>المادة الثانية :</td>\n",
       "      <td>الثانية</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>يقصد بالألفاظ والعبارات الآتية – أينما وردت في...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>3519</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة الثالثة:</td>\n",
       "      <td>الثالثة</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>العمل حق للمواطن ، لا يجوز لغيره ممارسته إلا ب...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>258</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة الرابعة:</td>\n",
       "      <td>الرابعة</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>يجب على صاحب العمل والعامل عند تطبيق أحكام هذا...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>97</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة الخامسة:</td>\n",
       "      <td>الخامسة</td>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>تسري أحكام هذا النظام على الآتي: كل عقد عمل يل...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>433</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة السادسة:</td>\n",
       "      <td>السادسة</td>\n",
       "      <td>6</td>\n",
       "      <td>6</td>\n",
       "      <td>تسري على العامل العرضي والموسمي والمؤقت الأحكا...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>272</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة السابعة :</td>\n",
       "      <td>السابعة</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>1- يستثنى من تطبيق أحكام هذا النظام كل من: أ‌-...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>1030</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة الثامنة:</td>\n",
       "      <td>الثامنة</td>\n",
       "      <td>8</td>\n",
       "      <td>8</td>\n",
       "      <td>يبطل كل شرط يخالف أحكام هذا النظام ، ويبطل كل ...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>160</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة التاسعة:</td>\n",
       "      <td>التاسعة</td>\n",
       "      <td>9</td>\n",
       "      <td>9</td>\n",
       "      <td>اللغة العربية هي الواجبة الإستعمال في البيانات...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>325</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>الباب الأول</td>\n",
       "      <td>التعريفات / الأحكام العامة</td>\n",
       "      <td>الفصل الثاني</td>\n",
       "      <td>المادة العاشرة:</td>\n",
       "      <td>العاشرة</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>تحسب جميع المدد والمواعيد المنصوص عليها في هذا...</td>\n",
       "      <td>https://www.hrsd.gov.sa/node/5575978</td>\n",
       "      <td>الباب الأول - التعريفات / الأحكام العامة - الف...</td>\n",
       "      <td>129</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   bab_order    bab_label                   bab_title          fasl  \\\n",
       "0          1  الباب الأول  التعريفات / الأحكام العامة   الفصل الأول   \n",
       "1          1  الباب الأول  التعريفات / الأحكام العامة   الفصل الأول   \n",
       "2          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "3          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "4          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "5          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "6          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "7          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "8          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "9          1  الباب الأول  التعريفات / الأحكام العامة  الفصل الثاني   \n",
       "\n",
       "      article_title article_number article_number_label  article_number_int  \\\n",
       "0    المادة الأولى:         الأولى                    1                   1   \n",
       "1  المادة الثانية :        الثانية                    2                   2   \n",
       "2   المادة الثالثة:        الثالثة                    3                   3   \n",
       "3   المادة الرابعة:        الرابعة                    4                   4   \n",
       "4   المادة الخامسة:        الخامسة                    5                   5   \n",
       "5   المادة السادسة:        السادسة                    6                   6   \n",
       "6  المادة السابعة :        السابعة                    7                   7   \n",
       "7   المادة الثامنة:        الثامنة                    8                   8   \n",
       "8   المادة التاسعة:        التاسعة                    9                   9   \n",
       "9   المادة العاشرة:        العاشرة                   10                  10   \n",
       "\n",
       "                                        article_text  \\\n",
       "0                        يسمى هذا النظام نظام العمل.   \n",
       "1  يقصد بالألفاظ والعبارات الآتية – أينما وردت في...   \n",
       "2  العمل حق للمواطن ، لا يجوز لغيره ممارسته إلا ب...   \n",
       "3  يجب على صاحب العمل والعامل عند تطبيق أحكام هذا...   \n",
       "4  تسري أحكام هذا النظام على الآتي: كل عقد عمل يل...   \n",
       "5  تسري على العامل العرضي والموسمي والمؤقت الأحكا...   \n",
       "6  1- يستثنى من تطبيق أحكام هذا النظام كل من: أ‌-...   \n",
       "7  يبطل كل شرط يخالف أحكام هذا النظام ، ويبطل كل ...   \n",
       "8  اللغة العربية هي الواجبة الإستعمال في البيانات...   \n",
       "9  تحسب جميع المدد والمواعيد المنصوص عليها في هذا...   \n",
       "\n",
       "                             source_url  \\\n",
       "0  https://www.hrsd.gov.sa/node/5575978   \n",
       "1  https://www.hrsd.gov.sa/node/5575978   \n",
       "2  https://www.hrsd.gov.sa/node/5575978   \n",
       "3  https://www.hrsd.gov.sa/node/5575978   \n",
       "4  https://www.hrsd.gov.sa/node/5575978   \n",
       "5  https://www.hrsd.gov.sa/node/5575978   \n",
       "6  https://www.hrsd.gov.sa/node/5575978   \n",
       "7  https://www.hrsd.gov.sa/node/5575978   \n",
       "8  https://www.hrsd.gov.sa/node/5575978   \n",
       "9  https://www.hrsd.gov.sa/node/5575978   \n",
       "\n",
       "                                     searchable_text  text_len article_status  \n",
       "0  الباب الأول - التعريفات / الأحكام العامة - الف...        27         active  \n",
       "1  الباب الأول - التعريفات / الأحكام العامة - الف...      3519         active  \n",
       "2  الباب الأول - التعريفات / الأحكام العامة - الف...       258         active  \n",
       "3  الباب الأول - التعريفات / الأحكام العامة - الف...        97         active  \n",
       "4  الباب الأول - التعريفات / الأحكام العامة - الف...       433         active  \n",
       "5  الباب الأول - التعريفات / الأحكام العامة - الف...       272         active  \n",
       "6  الباب الأول - التعريفات / الأحكام العامة - الف...      1030         active  \n",
       "7  الباب الأول - التعريفات / الأحكام العامة - الف...       160         active  \n",
       "8  الباب الأول - التعريفات / الأحكام العامة - الف...       325         active  \n",
       "9  الباب الأول - التعريفات / الأحكام العامة - الف...       129         active  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# =========================================================\n",
    "# Scrape Saudi Labor Law from HRSD by باب / فصل / مادة\n",
    "# Source: HRSD - نظام العمل\n",
    "# =========================================================\n",
    "\n",
    "# إذا أول مرة تشغل الكود:\n",
    "# !pip install requests beautifulsoup4 pandas openpyxl lxml\n",
    "\n",
    "import re\n",
    "import time\n",
    "import json\n",
    "import requests\n",
    "import pandas as pd\n",
    "\n",
    "from bs4 import BeautifulSoup\n",
    "from urllib.parse import urljoin\n",
    "\n",
    "\n",
    "# ============================================================\n",
    "# محوّل ترتيب المادة العربي إلى رقم\n",
    "# ============================================================\n",
    "\n",
    "ORDINAL_UNITS = {\n",
    "    \"الأولى\":1,\"الحادية\":1,\n",
    "    \"الثانية\":2,\"الثالثة\":3,\"الرابعة\":4,\"الخامسة\":5,\n",
    "    \"السادسة\":6,\"السابعة\":7,\"الثامنة\":8,\"التاسعة\":9,\"العاشرة\":10,\n",
    "}\n",
    "ORDINAL_TENS = {\n",
    "    \"العشرون\":20,\"العشرين\":20,\"الثلاثون\":30,\"الثلاثين\":30,\n",
    "    \"الأربعون\":40,\"الأربعين\":40,\"الخمسون\":50,\"الخمسين\":50,\n",
    "    \"الستون\":60,\"الستين\":60,\"السبعون\":70,\"السبعين\":70,\n",
    "    \"الثمانون\":80,\"الثمانين\":80,\"التسعون\":90,\"التسعين\":90,\n",
    "}\n",
    "\n",
    "\n",
    "def _wrap_ordinal(n, bis):\n",
    "    return f\"{n}مكرر\" if bis else str(n)\n",
    "\n",
    "\n",
    "def arabic_ordinal_to_int(text):\n",
    "    \"\"\"تحويل ترتيب المادة العربي إلى نص رقمي، مع حفظ علامة (مكرر).\"\"\"\n",
    "    if text is None:\n",
    "        return None\n",
    "    s = str(text).strip()\n",
    "    if not s:\n",
    "        return None\n",
    "\n",
    "    bis = \"مكرر\" in s\n",
    "    if bis:\n",
    "        s = s.replace(\"مكرر\", \"\").strip()\n",
    "\n",
    "    hundreds = 0\n",
    "    if \"بعد المائتين\" in s:\n",
    "        hundreds = 200\n",
    "        s = s.replace(\"بعد المائتين\", \"\").strip()\n",
    "    elif \"بعد المائة\" in s:\n",
    "        hundreds = 100\n",
    "        s = s.replace(\"بعد المائة\", \"\").strip()\n",
    "\n",
    "    s = re.sub(r\"\\s+\", \" \", s).strip()\n",
    "\n",
    "    if s == \"المائة\":\n",
    "        return _wrap_ordinal(100, bis)\n",
    "    if s in (\"المئتان\", \"المئتين\"):\n",
    "        return _wrap_ordinal(200, bis)\n",
    "    if s == \"\" and hundreds:\n",
    "        return _wrap_ordinal(hundreds, bis)\n",
    "\n",
    "    base = None\n",
    "\n",
    "    m = re.match(r\"^(\\S+)\\s+عشرة$\", s)\n",
    "    if m and m.group(1) in ORDINAL_UNITS and ORDINAL_UNITS[m.group(1)] <= 9:\n",
    "        base = 10 + ORDINAL_UNITS[m.group(1)]\n",
    "\n",
    "    if base is None and \" و\" in s:\n",
    "        ones_w, rest = s.split(\" و\", 1)\n",
    "        ones_w = ones_w.strip()\n",
    "        rest = rest.strip()\n",
    "        tens_val = ORDINAL_TENS.get(rest) or ORDINAL_TENS.get(\"ال\" + rest.lstrip(\"ال\"))\n",
    "        if ones_w in ORDINAL_UNITS and tens_val:\n",
    "            base = ORDINAL_UNITS[ones_w] + tens_val\n",
    "\n",
    "    if base is None and s in ORDINAL_TENS:\n",
    "        base = ORDINAL_TENS[s]\n",
    "\n",
    "    if base is None and s in ORDINAL_UNITS:\n",
    "        base = ORDINAL_UNITS[s]\n",
    "\n",
    "    if base is None:\n",
    "        return None\n",
    "\n",
    "    return _wrap_ordinal(base + hundreds, bis)\n",
    "\n",
    "\n",
    "def article_number_to_int(label):\n",
    "    \"\"\"يحوّل ناتج المحوّل النصي إلى رقم صحيح، ويتجاهل (مكرر).\"\"\"\n",
    "    if not label:\n",
    "        return None\n",
    "    digits = re.sub(r\"\\D\", \"\", label)\n",
    "    return int(digits) if digits else None\n",
    "\n",
    "\n",
    "# ============================================================\n",
    "# إعدادات السحب\n",
    "# ============================================================\n",
    "\n",
    "MAIN_URL = \"https://www.hrsd.gov.sa/knowledge-centre/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%84\"\n",
    "BASE_URL = \"https://www.hrsd.gov.sa\"\n",
    "\n",
    "LAW_OUTPUT_CSV = \"saudi_labor_law_by_bab_articles.csv\"\n",
    "LAW_OUTPUT_XLSX = \"saudi_labor_law_by_bab_articles.xlsx\"\n",
    "LAW_OUTPUT_JSON = \"saudi_labor_law_by_bab_articles.json\"\n",
    "\n",
    "\n",
    "HEADERS = {\n",
    "    \"User-Agent\": (\n",
    "        \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \"\n",
    "        \"AppleWebKit/537.36 (KHTML, like Gecko) \"\n",
    "        \"Chrome/120.0.0.0 Safari/537.36\"\n",
    "    ),\n",
    "    \"Accept-Language\": \"ar,en;q=0.9\",\n",
    "}\n",
    "\n",
    "\n",
    "def clean_text(text: str) -> str:\n",
    "    \"\"\"تنظيف المسافات والرموز غير المرغوبة مع الحفاظ على العربية.\"\"\"\n",
    "    if text is None:\n",
    "        return \"\"\n",
    "    text = text.replace(\"\\xa0\", \" \")\n",
    "    text = re.sub(r\"\\s+\", \" \", text)\n",
    "    return text.strip()\n",
    "\n",
    "\n",
    "def get_soup(url: str) -> BeautifulSoup:\n",
    "    \"\"\"تحميل الصفحة وتحويلها إلى BeautifulSoup.\"\"\"\n",
    "    response = requests.get(url, headers=HEADERS, timeout=30)\n",
    "    response.raise_for_status()\n",
    "    return BeautifulSoup(response.text, \"lxml\")\n",
    "\n",
    "\n",
    "def remove_unwanted_tags(soup: BeautifulSoup) -> BeautifulSoup:\n",
    "    \"\"\"إزالة العناصر غير المفيدة مثل النافبار والفوتر والسكريبتات.\"\"\"\n",
    "    for tag in soup([\"script\", \"style\", \"noscript\", \"svg\"]):\n",
    "        tag.decompose()\n",
    "\n",
    "    for selector in [\"header\", \"footer\", \"nav\"]:\n",
    "        for tag in soup.select(selector):\n",
    "            tag.decompose()\n",
    "\n",
    "    return soup\n",
    "\n",
    "\n",
    "def extract_bab_links(main_url: str) -> list:\n",
    "    \"\"\"\n",
    "    استخراج روابط الأبواب من صفحة نظام العمل الرئيسية.\n",
    "    \"\"\"\n",
    "    soup = get_soup(main_url)\n",
    "    soup = remove_unwanted_tags(soup)\n",
    "\n",
    "    h1 = None\n",
    "    for candidate in soup.find_all(\"h1\"):\n",
    "        if \"نظام العمل\" in clean_text(candidate.get_text(\" \")):\n",
    "            h1 = candidate\n",
    "            break\n",
    "\n",
    "    if h1 is None:\n",
    "        raise ValueError(\"لم أجد عنوان صفحة نظام العمل. قد تكون بنية الصفحة تغيّرت.\")\n",
    "\n",
    "    bab_links = []\n",
    "    bab_order = 0\n",
    "\n",
    "    for h in h1.find_all_next([\"h2\", \"h3\", \"h4\"]):\n",
    "        heading_text = clean_text(h.get_text(\" \"))\n",
    "\n",
    "        if \"تاريخ آخر تحديث\" in heading_text or \"هل كانت هذه الصفحة مفيدة\" in heading_text:\n",
    "            break\n",
    "\n",
    "        if re.match(r\"^الباب\\s+\", heading_text):\n",
    "            bab_order += 1\n",
    "            bab_label = heading_text.replace(\":\", \"\").strip()\n",
    "\n",
    "            link = h.find_next(\"a\")\n",
    "            if not link:\n",
    "                continue\n",
    "\n",
    "            bab_title = clean_text(link.get_text(\" \"))\n",
    "            bab_url = urljoin(BASE_URL, link.get(\"href\"))\n",
    "\n",
    "            bab_links.append({\n",
    "                \"bab_order\": bab_order,\n",
    "                \"bab_label\": bab_label,\n",
    "                \"bab_title\": bab_title,\n",
    "                \"bab_url\": bab_url\n",
    "            })\n",
    "\n",
    "    return bab_links\n",
    "\n",
    "\n",
    "def extract_article_number(article_title: str) -> str:\n",
    "    \"\"\"\n",
    "    استخراج اسم المادة العربي من عنوان مثل:\n",
    "    المادة الأولى:\n",
    "    المادة الحادية عشرة مكرر :\n",
    "    \"\"\"\n",
    "    article_title = clean_text(article_title)\n",
    "    article_title = article_title.replace(\":\", \"\").strip()\n",
    "    article_title = re.sub(r\"^المادة\\s*\", \"\", article_title).strip()\n",
    "    return article_title\n",
    "\n",
    "\n",
    "def extract_articles_from_bab(bab: dict) -> list:\n",
    "    \"\"\"\n",
    "    الدخول على صفحة باب واحد واستخراج:\n",
    "    الباب، الفصل، المادة، نص المادة.\n",
    "    \"\"\"\n",
    "    soup = get_soup(bab[\"bab_url\"])\n",
    "    soup = remove_unwanted_tags(soup)\n",
    "\n",
    "    h1 = soup.find(\"h1\")\n",
    "    if h1 is None:\n",
    "        raise ValueError(f\"لم أجد عنوان الصفحة داخل الرابط: {bab['bab_url']}\")\n",
    "\n",
    "    rows = []\n",
    "\n",
    "    current_fasl = \"\"\n",
    "    current_article_title = \"\"\n",
    "    current_article_number = \"\"\n",
    "    current_article_lines = []\n",
    "\n",
    "    def flush_article():\n",
    "        \"\"\"حفظ المادة الحالية قبل الانتقال للمادة التالية.\"\"\"\n",
    "        nonlocal current_article_title, current_article_number, current_article_lines\n",
    "\n",
    "        article_text = clean_text(\" \".join(current_article_lines))\n",
    "\n",
    "        if current_article_title and article_text:\n",
    "            searchable_text = clean_text(\n",
    "                f\"{bab['bab_label']} - {bab['bab_title']} - \"\n",
    "                f\"{current_fasl} - {current_article_title} - {article_text}\"\n",
    "            )\n",
    "\n",
    "            article_label = arabic_ordinal_to_int(current_article_number)\n",
    "\n",
    "            rows.append({\n",
    "                \"bab_order\": bab[\"bab_order\"],\n",
    "                \"bab_label\": bab[\"bab_label\"],\n",
    "                \"bab_title\": bab[\"bab_title\"],\n",
    "                \"fasl\": current_fasl,\n",
    "                \"article_title\": current_article_title,\n",
    "                \"article_number\": current_article_number,\n",
    "                \"article_number_label\": article_label,\n",
    "                \"article_number_int\": article_number_to_int(article_label),\n",
    "                \"article_text\": article_text,\n",
    "                \"source_url\": bab[\"bab_url\"],\n",
    "                \"searchable_text\": searchable_text\n",
    "            })\n",
    "\n",
    "        current_article_title = \"\"\n",
    "        current_article_number = \"\"\n",
    "        current_article_lines = []\n",
    "\n",
    "    content_tags = h1.find_all_next([\"h2\", \"h3\", \"h4\", \"h5\", \"p\", \"li\"])\n",
    "\n",
    "    previous_text = None\n",
    "\n",
    "    for tag in content_tags:\n",
    "        text = clean_text(tag.get_text(\" \"))\n",
    "\n",
    "        if not text:\n",
    "            continue\n",
    "\n",
    "        stop_markers = [\n",
    "            \"تمثل صفحة المستفيد\",\n",
    "            \"تاريخ آخر تحديث\",\n",
    "            \"هل كانت هذه الصفحة مفيدة\",\n",
    "            \"من فضلك أخبرنا بالسبب\",\n",
    "            \"جميع الحقوق محفوظة\"\n",
    "        ]\n",
    "\n",
    "        if any(marker in text for marker in stop_markers):\n",
    "            break\n",
    "\n",
    "        if text == previous_text:\n",
    "            continue\n",
    "        previous_text = text\n",
    "\n",
    "        if text == bab[\"bab_title\"]:\n",
    "            continue\n",
    "\n",
    "        if re.match(r\"^الفصل\\s+\", text):\n",
    "            flush_article()\n",
    "            current_fasl = text\n",
    "            continue\n",
    "\n",
    "        if re.match(r\"^المادة\\s+\", text):\n",
    "            flush_article()\n",
    "            current_article_title = text\n",
    "            current_article_number = extract_article_number(text)\n",
    "            current_article_lines = []\n",
    "            continue\n",
    "\n",
    "        if current_article_title:\n",
    "            current_article_lines.append(text)\n",
    "\n",
    "    flush_article()\n",
    "\n",
    "    return rows\n",
    "\n",
    "\n",
    "def main():\n",
    "    print(\"جاري استخراج روابط الأبواب...\")\n",
    "    bab_links = extract_bab_links(MAIN_URL)\n",
    "\n",
    "    print(f\"عدد الأبواب التي تم العثور عليها: {len(bab_links)}\")\n",
    "    for bab in bab_links:\n",
    "        print(f\"- {bab['bab_label']} | {bab['bab_title']}\")\n",
    "\n",
    "    all_rows = []\n",
    "\n",
    "    print(\"\\nجاري استخراج المواد من كل باب...\")\n",
    "    for bab in bab_links:\n",
    "        print(f\"سحب: {bab['bab_label']} - {bab['bab_title']}\")\n",
    "\n",
    "        try:\n",
    "            rows = extract_articles_from_bab(bab)\n",
    "            all_rows.extend(rows)\n",
    "            print(f\"  تم استخراج {len(rows)} مادة\")\n",
    "            time.sleep(1)  # احترام الموقع وعدم الضغط عليه\n",
    "\n",
    "        except Exception as e:\n",
    "            print(f\"  خطأ في {bab['bab_title']}: {e}\")\n",
    "\n",
    "    df = pd.DataFrame(all_rows)\n",
    "\n",
    "    columns = [\n",
    "        \"bab_order\",\n",
    "        \"bab_label\",\n",
    "        \"bab_title\",\n",
    "        \"fasl\",\n",
    "        \"article_title\",\n",
    "        \"article_number\",\n",
    "        \"article_number_label\",\n",
    "        \"article_number_int\",\n",
    "        \"article_text\",\n",
    "        \"source_url\",\n",
    "        \"searchable_text\"\n",
    "    ]\n",
    "\n",
    "    df = df[columns]\n",
    "\n",
    "    # ============================================================\n",
    "    # تنظيف نهائي بعد السحب\n",
    "    # الهدف: إزالة التكرارات الناتجة من بنية صفحة الويب\n",
    "    # مع الاحتفاظ بكل مادة قانونية حقيقية، بما فيها المواد الملغاة\n",
    "    # ============================================================\n",
    "\n",
    "    def normalize_article_text_for_save(text):\n",
    "        text = clean_text(text)\n",
    "        text = re.sub(r\"[ـ]+\", \"\", text)          # إزالة التطويل من مثل: ملغــــاة\n",
    "        text = re.sub(r\"\\s+\", \" \", text).strip()\n",
    "        return text\n",
    "\n",
    "    df[\"article_text\"] = df[\"article_text\"].fillna(\"\").astype(str).apply(normalize_article_text_for_save)\n",
    "    df[\"text_len\"] = df[\"article_text\"].str.len()\n",
    "\n",
    "    # تصنيف حالة المادة: فعالة أو ملغاة\n",
    "    df[\"article_status\"] = df[\"article_text\"].apply(\n",
    "        lambda x: \"repealed\" if (\"ملغاة\" in x or \"ملغى\" in x) else \"active\"\n",
    "    )\n",
    "\n",
    "    # مفتاح آمن للتكرار:\n",
    "    # نستخدم article_number_label حتى لا نحذف المواد المكررة قانونياً لو ظهر نص \"مكرر\"\n",
    "    # وإذا لم يوجد رقم واضح نستخدم عنوان المادة كحل احتياطي.\n",
    "    df[\"article_unique_key\"] = df[\"article_number_label\"].fillna(\"\").astype(str).str.strip()\n",
    "    missing_key = df[\"article_unique_key\"].isin([\"\", \"None\", \"nan\", \"NaN\"])\n",
    "    df.loc[missing_key, \"article_unique_key\"] = df.loc[missing_key, \"article_title\"].fillna(\"\").astype(str).str.strip()\n",
    "\n",
    "    rows_before = len(df)\n",
    "\n",
    "    # إزالة التكرار مع الاحتفاظ بأطول نص لكل مادة\n",
    "    df = (\n",
    "        df.sort_values([\"article_unique_key\", \"text_len\"], ascending=[True, False])\n",
    "          .drop_duplicates(subset=[\"article_unique_key\"], keep=\"first\")\n",
    "          .sort_values([\"article_number_int\", \"article_title\"], ascending=[True, True])\n",
    "          .reset_index(drop=True)\n",
    "    )\n",
    "\n",
    "    rows_after = len(df)\n",
    "\n",
    "    # تحديث searchable_text بعد التنظيف\n",
    "    df[\"searchable_text\"] = df.apply(\n",
    "        lambda row: clean_text(\n",
    "            f\"{row['bab_label']} - {row['bab_title']} - \"\n",
    "            f\"{row['fasl']} - {row['article_title']} - {row['article_text']}\"\n",
    "        ),\n",
    "        axis=1\n",
    "    )\n",
    "\n",
    "    # حذف المفتاح المساعد من ملف الحفظ\n",
    "    df = df.drop(columns=[\"article_unique_key\"])\n",
    "\n",
    "    # فحص جودة نهائي\n",
    "    nums = set(df[\"article_number_int\"].dropna().astype(int))\n",
    "    missing_articles = [n for n in range(1, 246) if n not in nums]\n",
    "    duplicated_labels = df[\"article_number_label\"].duplicated().sum()\n",
    "    empty_texts = (df[\"article_text\"].astype(str).str.strip() == \"\").sum()\n",
    "\n",
    "    print(\"\\nفحص جودة مواد نظام العمل بعد التنظيف:\")\n",
    "    print(f\"عدد الصفوف قبل إزالة التكرار: {rows_before}\")\n",
    "    print(f\"عدد الصفوف بعد إزالة التكرار: {rows_after}\")\n",
    "    print(f\"عدد المواد: {len(nums)} | الأعلى: {max(nums) if nums else None}\")\n",
    "    print(f\"المفقود من 1 إلى 245: {missing_articles}\")\n",
    "    print(f\"عدد التكرارات حسب رقم المادة: {duplicated_labels}\")\n",
    "    print(f\"عدد المواد بدون نص: {empty_texts}\")\n",
    "    print(\"توزيع حالة المواد:\")\n",
    "    print(df[\"article_status\"].value_counts())\n",
    "\n",
    "    df.to_csv(LAW_OUTPUT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "    df.to_excel(LAW_OUTPUT_XLSX, index=False)\n",
    "\n",
    "    with open(LAW_OUTPUT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "        json.dump(df.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "    print(\"\\nتم الانتهاء بنجاح\")\n",
    "    print(f\"عدد المواد النهائي: {len(df)}\")\n",
    "    print(f\"CSV  : {LAW_OUTPUT_CSV}\")\n",
    "    print(f\"Excel: {LAW_OUTPUT_XLSX}\")\n",
    "    print(f\"JSON : {LAW_OUTPUT_JSON}\")\n",
    "\n",
    "    return df\n",
    "\n",
    "\n",
    "df_labor_law = main()\n",
    "\n",
    "df_labor_law.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9bc92bb",
   "metadata": {},
   "source": [
    "### 1.1 معاينة المواد المسحوبة"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "061aebb4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>article_title</th>\n",
       "      <th>article_number</th>\n",
       "      <th>article_number_int</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>المادة الأولى:</td>\n",
       "      <td>الأولى</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>المادة الثانية :</td>\n",
       "      <td>الثانية</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>المادة الثالثة:</td>\n",
       "      <td>الثالثة</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>المادة الرابعة:</td>\n",
       "      <td>الرابعة</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>المادة الخامسة:</td>\n",
       "      <td>الخامسة</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>المادة السادسة:</td>\n",
       "      <td>السادسة</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>المادة السابعة :</td>\n",
       "      <td>السابعة</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>المادة الثامنة:</td>\n",
       "      <td>الثامنة</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>المادة التاسعة:</td>\n",
       "      <td>التاسعة</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>المادة العاشرة:</td>\n",
       "      <td>العاشرة</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>المادة الحادية عشرة مكرر :</td>\n",
       "      <td>الحادية عشرة مكرر</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>المادة الحادية عشرة:</td>\n",
       "      <td>الحادية عشرة</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>المادة الثانية عشرة:</td>\n",
       "      <td>الثانية عشرة</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>المادة الثالثة عشرة :</td>\n",
       "      <td>الثالثة عشرة</td>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>المادة الرابعة عشرة:</td>\n",
       "      <td>الرابعة عشرة</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 article_title     article_number  article_number_int\n",
       "0               المادة الأولى:             الأولى                   1\n",
       "1             المادة الثانية :            الثانية                   2\n",
       "2              المادة الثالثة:            الثالثة                   3\n",
       "3              المادة الرابعة:            الرابعة                   4\n",
       "4              المادة الخامسة:            الخامسة                   5\n",
       "5              المادة السادسة:            السادسة                   6\n",
       "6             المادة السابعة :            السابعة                   7\n",
       "7              المادة الثامنة:            الثامنة                   8\n",
       "8              المادة التاسعة:            التاسعة                   9\n",
       "9              المادة العاشرة:            العاشرة                  10\n",
       "10  المادة الحادية عشرة مكرر :  الحادية عشرة مكرر                  11\n",
       "11        المادة الحادية عشرة:       الحادية عشرة                  11\n",
       "12        المادة الثانية عشرة:       الثانية عشرة                  12\n",
       "13       المادة الثالثة عشرة :       الثالثة عشرة                  13\n",
       "14        المادة الرابعة عشرة:       الرابعة عشرة                  14"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_labor_law[[\"article_title\", \"article_number\", \"article_number_int\"]].head(15)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4066fda",
   "metadata": {},
   "source": [
    "### 1.2 فحص اكتمال المواد\n",
    "\n",
    "يتحقق من تغطية الأرقام من 1 إلى 245. يجب أن تكون قائمة المفقود فارغة."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "53405e5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "عدد المواد: 245 | الأعلى: 245\n",
      "المفقود من 1 إلى 245: []\n"
     ]
    }
   ],
   "source": [
    "nums = set(df_labor_law[\"article_number_int\"].dropna().astype(int))\n",
    "print(\"عدد المواد:\", len(nums), \"| الأعلى:\", max(nums))\n",
    "print(\"المفقود من 1 إلى 245:\", [n for n in range(1, 246) if n not in nums])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc08434f",
   "metadata": {},
   "source": [
    "### 1.3 تشخيص جودة المواد\n",
    "\n",
    "يعدّ التكرارات، والمواد بلا نص، والنصوص القصيرة جداً، ويعرض أمثلة عليها.\n",
    "\n",
    "ملاحظة: التكرارات الأربعة هي مواد (مكرر) التي تشترك في الرقم الأساسي، وليست تكراراً حقيقياً."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "156ff1aa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "عدد الصفوف الكلي: 249\n",
      "عدد أرقام المواد الفريدة: 245\n",
      "عدد التكرارات في رقم المادة: 4\n",
      "عدد المواد بدون نص: 0\n",
      "عدد المواد بنص قصير جداً: 39\n",
      "\n",
      "=== المواد المكررة ===\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>article_number_int</th>\n",
       "      <th>article_title</th>\n",
       "      <th>article_text</th>\n",
       "      <th>text_len</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "      <td>المادة الحادية عشرة:</td>\n",
       "      <td>إذا عهد صاحب العمل لأي شخص طبيعي أو معنوي القي...</td>\n",
       "      <td>176</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>المادة الحادية عشرة مكرر :</td>\n",
       "      <td>مع عدم الإخلال بأحكام هذا النظام والأنظمة ذات ...</td>\n",
       "      <td>160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>79</td>\n",
       "      <td>المادة التاسعة والسبعون مكرر:</td>\n",
       "      <td>يُعد طلب الاستقالة المقدم مقبولاً إذا مضى على ...</td>\n",
       "      <td>930</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>79</td>\n",
       "      <td>المادة التاسعة والسبعون:</td>\n",
       "      <td>لا ينقضي عقد العمل بوفاة صاحب العمل ، ما لم تك...</td>\n",
       "      <td>225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>131</td>\n",
       "      <td>المادة الحادية والثلاثون بعد المائة مكرر:</td>\n",
       "      <td>يحدد الوزير - بقرار منه - المهن والأعمال التي ...</td>\n",
       "      <td>341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>133</th>\n",
       "      <td>131</td>\n",
       "      <td>المادة الحادية والثلاثون بعد المائة:</td>\n",
       "      <td>يصدر الوزير اللوائح والقرارات التي تتضمن الترت...</td>\n",
       "      <td>340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>231</th>\n",
       "      <td>229</td>\n",
       "      <td>المادة التاسعة والعشرون بعد المائتين :</td>\n",
       "      <td>1 – مع عدم الإخلال بأي عقوبة أشد ينص عليها نظا...</td>\n",
       "      <td>427</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>232</th>\n",
       "      <td>229</td>\n",
       "      <td>المادة التاسعة والعشرون بعد المائتين مكرر:</td>\n",
       "      <td>يعاقب بغرامة لا تقل عن (200,000) مائتي ألف ريا...</td>\n",
       "      <td>224</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     article_number_int                               article_title  \\\n",
       "11                   11                        المادة الحادية عشرة:   \n",
       "10                   11                  المادة الحادية عشرة مكرر :   \n",
       "79                   79               المادة التاسعة والسبعون مكرر:   \n",
       "80                   79                    المادة التاسعة والسبعون:   \n",
       "132                 131   المادة الحادية والثلاثون بعد المائة مكرر:   \n",
       "133                 131        المادة الحادية والثلاثون بعد المائة:   \n",
       "231                 229      المادة التاسعة والعشرون بعد المائتين :   \n",
       "232                 229  المادة التاسعة والعشرون بعد المائتين مكرر:   \n",
       "\n",
       "                                          article_text  text_len  \n",
       "11   إذا عهد صاحب العمل لأي شخص طبيعي أو معنوي القي...       176  \n",
       "10   مع عدم الإخلال بأحكام هذا النظام والأنظمة ذات ...       160  \n",
       "79   يُعد طلب الاستقالة المقدم مقبولاً إذا مضى على ...       930  \n",
       "80   لا ينقضي عقد العمل بوفاة صاحب العمل ، ما لم تك...       225  \n",
       "132  يحدد الوزير - بقرار منه - المهن والأعمال التي ...       341  \n",
       "133  يصدر الوزير اللوائح والقرارات التي تتضمن الترت...       340  \n",
       "231  1 – مع عدم الإخلال بأي عقوبة أشد ينص عليها نظا...       427  \n",
       "232  يعاقب بغرامة لا تقل عن (200,000) مائتي ألف ريا...       224  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== المواد ذات النص القصير جداً ===\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>article_number_int</th>\n",
       "      <th>article_title</th>\n",
       "      <th>article_text</th>\n",
       "      <th>text_len</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>المادة الأولى:</td>\n",
       "      <td>يسمى هذا النظام نظام العمل.</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "      <td>المادة الرابعة عشرة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>151</th>\n",
       "      <td>149</td>\n",
       "      <td>المادة التاسعة والأربعون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>152</th>\n",
       "      <td>150</td>\n",
       "      <td>المادة الخمسون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>154</th>\n",
       "      <td>152</td>\n",
       "      <td>المادة الثانية والخمسون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>158</th>\n",
       "      <td>156</td>\n",
       "      <td>المادة السادسة والخمسون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197</th>\n",
       "      <td>195</td>\n",
       "      <td>المادة الخامسة والتسعون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>199</th>\n",
       "      <td>197</td>\n",
       "      <td>المادة السابعة والتسعون بعد المائة:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>205</th>\n",
       "      <td>203</td>\n",
       "      <td>المادة الثالثة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>207</th>\n",
       "      <td>205</td>\n",
       "      <td>المادة الخامسة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>208</th>\n",
       "      <td>206</td>\n",
       "      <td>المادة السادسة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>209</th>\n",
       "      <td>207</td>\n",
       "      <td>المادة السابعة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>210</th>\n",
       "      <td>208</td>\n",
       "      <td>المادة الثامنة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>210</td>\n",
       "      <td>المادة العاشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>213</th>\n",
       "      <td>211</td>\n",
       "      <td>المادة الحادية عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>214</th>\n",
       "      <td>212</td>\n",
       "      <td>المادة الثانية عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>215</th>\n",
       "      <td>213</td>\n",
       "      <td>المادة الثالثة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>216</th>\n",
       "      <td>214</td>\n",
       "      <td>المادة الرابعة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>217</th>\n",
       "      <td>215</td>\n",
       "      <td>المادة الخامسة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>218</th>\n",
       "      <td>216</td>\n",
       "      <td>المادة السادسة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>219</th>\n",
       "      <td>217</td>\n",
       "      <td>المادة السابعة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>220</th>\n",
       "      <td>218</td>\n",
       "      <td>المادة الثامنة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>221</th>\n",
       "      <td>219</td>\n",
       "      <td>المادة التاسعة عشرة بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>222</th>\n",
       "      <td>220</td>\n",
       "      <td>المادة العشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>223</th>\n",
       "      <td>221</td>\n",
       "      <td>المادة الحادية والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>224</th>\n",
       "      <td>222</td>\n",
       "      <td>المادة الثانية والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>225</th>\n",
       "      <td>223</td>\n",
       "      <td>المادة الثالثة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>226</th>\n",
       "      <td>224</td>\n",
       "      <td>المادة الرابعة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>227</th>\n",
       "      <td>225</td>\n",
       "      <td>المادة الخامسة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>228</th>\n",
       "      <td>226</td>\n",
       "      <td>المادة السادسة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>229</th>\n",
       "      <td>227</td>\n",
       "      <td>المادة السابعة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>230</th>\n",
       "      <td>228</td>\n",
       "      <td>المادة الثامنة والعشرون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>239</th>\n",
       "      <td>236</td>\n",
       "      <td>المادة السادسة والثلاثين بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>240</th>\n",
       "      <td>237</td>\n",
       "      <td>المادة السابعة والثلاثين بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>241</th>\n",
       "      <td>238</td>\n",
       "      <td>المادة الثامنة والثلاثين بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>239</td>\n",
       "      <td>المادة التاسعة والثلاثين بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>243</th>\n",
       "      <td>240</td>\n",
       "      <td>المادة الأربعون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>244</th>\n",
       "      <td>241</td>\n",
       "      <td>المادة الحادية والأربعون بعد المائتين:</td>\n",
       "      <td>(ملغاة)</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>245</th>\n",
       "      <td>242</td>\n",
       "      <td>المادة الثانية والأربعون بعد المائتين:</td>\n",
       "      <td>(ملغاة</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     article_number_int                           article_title  \\\n",
       "0                     1                          المادة الأولى:   \n",
       "14                   14                    المادة الرابعة عشرة:   \n",
       "151                 149    المادة التاسعة والأربعون بعد المائة:   \n",
       "152                 150              المادة الخمسون بعد المائة:   \n",
       "154                 152     المادة الثانية والخمسون بعد المائة:   \n",
       "158                 156     المادة السادسة والخمسون بعد المائة:   \n",
       "197                 195     المادة الخامسة والتسعون بعد المائة:   \n",
       "199                 197     المادة السابعة والتسعون بعد المائة:   \n",
       "205                 203            المادة الثالثة بعد المائتين:   \n",
       "207                 205            المادة الخامسة بعد المائتين:   \n",
       "208                 206            المادة السادسة بعد المائتين:   \n",
       "209                 207            المادة السابعة بعد المائتين:   \n",
       "210                 208            المادة الثامنة بعد المائتين:   \n",
       "212                 210            المادة العاشرة بعد المائتين:   \n",
       "213                 211       المادة الحادية عشرة بعد المائتين:   \n",
       "214                 212       المادة الثانية عشرة بعد المائتين:   \n",
       "215                 213       المادة الثالثة عشرة بعد المائتين:   \n",
       "216                 214       المادة الرابعة عشرة بعد المائتين:   \n",
       "217                 215       المادة الخامسة عشرة بعد المائتين:   \n",
       "218                 216       المادة السادسة عشرة بعد المائتين:   \n",
       "219                 217       المادة السابعة عشرة بعد المائتين:   \n",
       "220                 218       المادة الثامنة عشرة بعد المائتين:   \n",
       "221                 219       المادة التاسعة عشرة بعد المائتين:   \n",
       "222                 220            المادة العشرون بعد المائتين:   \n",
       "223                 221   المادة الحادية والعشرون بعد المائتين:   \n",
       "224                 222   المادة الثانية والعشرون بعد المائتين:   \n",
       "225                 223   المادة الثالثة والعشرون بعد المائتين:   \n",
       "226                 224   المادة الرابعة والعشرون بعد المائتين:   \n",
       "227                 225   المادة الخامسة والعشرون بعد المائتين:   \n",
       "228                 226   المادة السادسة والعشرون بعد المائتين:   \n",
       "229                 227   المادة السابعة والعشرون بعد المائتين:   \n",
       "230                 228   المادة الثامنة والعشرون بعد المائتين:   \n",
       "239                 236  المادة السادسة والثلاثين بعد المائتين:   \n",
       "240                 237  المادة السابعة والثلاثين بعد المائتين:   \n",
       "241                 238  المادة الثامنة والثلاثين بعد المائتين:   \n",
       "242                 239  المادة التاسعة والثلاثين بعد المائتين:   \n",
       "243                 240           المادة الأربعون بعد المائتين:   \n",
       "244                 241  المادة الحادية والأربعون بعد المائتين:   \n",
       "245                 242  المادة الثانية والأربعون بعد المائتين:   \n",
       "\n",
       "                    article_text  text_len  \n",
       "0    يسمى هذا النظام نظام العمل.        27  \n",
       "14                       (ملغاة)         7  \n",
       "151                      (ملغاة)         7  \n",
       "152                      (ملغاة)         7  \n",
       "154                      (ملغاة)         7  \n",
       "158                      (ملغاة)         7  \n",
       "197                      (ملغاة)         7  \n",
       "199                      (ملغاة)         7  \n",
       "205                      (ملغاة)         7  \n",
       "207                      (ملغاة)         7  \n",
       "208                      (ملغاة)         7  \n",
       "209                      (ملغاة)         7  \n",
       "210                      (ملغاة)         7  \n",
       "212                      (ملغاة)         7  \n",
       "213                      (ملغاة)         7  \n",
       "214                      (ملغاة)         7  \n",
       "215                      (ملغاة)         7  \n",
       "216                      (ملغاة)         7  \n",
       "217                      (ملغاة)         7  \n",
       "218                      (ملغاة)         7  \n",
       "219                      (ملغاة)         7  \n",
       "220                      (ملغاة)         7  \n",
       "221                      (ملغاة)         7  \n",
       "222                      (ملغاة)         7  \n",
       "223                      (ملغاة)         7  \n",
       "224                      (ملغاة)         7  \n",
       "225                      (ملغاة)         7  \n",
       "226                      (ملغاة)         7  \n",
       "227                      (ملغاة)         7  \n",
       "228                      (ملغاة)         7  \n",
       "229                      (ملغاة)         7  \n",
       "230                      (ملغاة)         7  \n",
       "239                      (ملغاة)         7  \n",
       "240                      (ملغاة)         7  \n",
       "241                      (ملغاة)         7  \n",
       "242                      (ملغاة)         7  \n",
       "243                      (ملغاة)         7  \n",
       "244                      (ملغاة)         7  \n",
       "245                       (ملغاة         6  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ============================================================\n",
    "# تشخيص التكرارات والمواد القصيرة\n",
    "# ============================================================\n",
    "\n",
    "df_check = df_labor_law.copy()\n",
    "\n",
    "df_check[\"article_text\"] = df_check[\"article_text\"].fillna(\"\").astype(str).str.strip()\n",
    "df_check[\"text_len\"] = df_check[\"article_text\"].str.len()\n",
    "\n",
    "print(\"عدد الصفوف الكلي:\", len(df_check))\n",
    "print(\"عدد أرقام المواد الفريدة:\", df_check[\"article_number_int\"].nunique())\n",
    "print(\"عدد التكرارات في رقم المادة:\", df_check[\"article_number_int\"].duplicated().sum())\n",
    "print(\"عدد المواد بدون نص:\", (df_check[\"article_text\"] == \"\").sum())\n",
    "print(\"عدد المواد بنص قصير جداً:\", (df_check[\"text_len\"] < 30).sum())\n",
    "\n",
    "print(\"\\n=== المواد المكررة ===\")\n",
    "duplicated_articles = (\n",
    "    df_check[df_check[\"article_number_int\"].duplicated(keep=False)]\n",
    "    .sort_values([\"article_number_int\", \"text_len\"], ascending=[True, False])\n",
    ")\n",
    "\n",
    "display(\n",
    "    duplicated_articles[\n",
    "        [\"article_number_int\", \"article_title\", \"article_text\", \"text_len\"]\n",
    "    ]\n",
    ")\n",
    "\n",
    "print(\"\\n=== المواد ذات النص القصير جداً ===\")\n",
    "short_articles = (\n",
    "    df_check[df_check[\"text_len\"] < 30]\n",
    "    .sort_values([\"article_number_int\"])\n",
    ")\n",
    "\n",
    "display(\n",
    "    short_articles[\n",
    "        [\"article_number_int\", \"article_title\", \"article_text\", \"text_len\"]\n",
    "    ]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec4cfa1f",
   "metadata": {},
   "source": [
    "### 1.4 تصنيف الحالة وإزالة التكرار النهائية\n",
    "\n",
    "تصنّف كل مادة إلى:\n",
    "\n",
    "- `active`: مادة فعّالة.\n",
    "- `repealed`: مادة ملغاة.\n",
    "\n",
    "كما يتم إزالة التكرار الحقيقي على أساس `article_number_label` وليس `article_number_int` فقط، لأن بعض مواد النظام تكون قانونياً بصيغة **مكرر**، وهذه يجب الحفاظ عليها وعدم اعتبارها تكراراً خاطئاً.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "66df8291",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "عدد الصفوف قبل إزالة التكرار: 249\n",
      "عدد الصفوف بعد إزالة التكرار: 249\n",
      "عدد المواد: 245 | الأعلى: 245\n",
      "المفقود من 1 إلى 245: []\n",
      "عدد التكرارات الحقيقية حسب article_number_label: 0\n",
      "عدد مواد مكرر القانونية حسب article_number_int: 4\n",
      "عدد المواد بدون نص: 0\n",
      "\n",
      "توزيع حالة المواد:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>article_status</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>active</th>\n",
       "      <td>211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>repealed</th>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                count\n",
       "article_status       \n",
       "active            211\n",
       "repealed           38"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "المواد القصيرة غير الملغاة:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>article_number_int</th>\n",
       "      <th>article_number_label</th>\n",
       "      <th>article_title</th>\n",
       "      <th>article_text</th>\n",
       "      <th>text_len</th>\n",
       "      <th>article_status</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>المادة الأولى:</td>\n",
       "      <td>يسمى هذا النظام نظام العمل.</td>\n",
       "      <td>27</td>\n",
       "      <td>active</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   article_number_int article_number_label   article_title  \\\n",
       "0                   1                    1  المادة الأولى:   \n",
       "\n",
       "                  article_text  text_len article_status  \n",
       "0  يسمى هذا النظام نظام العمل.        27         active  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "تم حفظ مواد نظام العمل النظيفة:\n",
      "saudi_labor_law_by_bab_articles.csv\n",
      "saudi_labor_law_by_bab_articles.xlsx\n",
      "saudi_labor_law_by_bab_articles.json\n"
     ]
    }
   ],
   "source": [
    "# ============================================================\n",
    "# Final Law Cleaning Cell\n",
    "# تصنيف حالة المادة + إزالة التكرار الحقيقي مع الحفاظ على مواد (مكرر)\n",
    "# ============================================================\n",
    "\n",
    "import re\n",
    "import json\n",
    "\n",
    "# أسماء ملفات مواد نظام العمل فقط\n",
    "LAW_OUTPUT_CSV = \"saudi_labor_law_by_bab_articles.csv\"\n",
    "LAW_OUTPUT_XLSX = \"saudi_labor_law_by_bab_articles.xlsx\"\n",
    "LAW_OUTPUT_JSON = \"saudi_labor_law_by_bab_articles.json\"\n",
    "\n",
    "\n",
    "def normalize_arabic_text(text):\n",
    "    \"\"\"تنظيف المسافات والتطويل مع الحفاظ على النص العربي.\"\"\"\n",
    "    text = str(text)\n",
    "    text = re.sub(r\"[ـ]+\", \"\", text)\n",
    "    text = re.sub(r\"\\s+\", \" \", text).strip()\n",
    "    return text\n",
    "\n",
    "\n",
    "def detect_article_status(text):\n",
    "    \"\"\"تصنيف المادة إلى فعالة أو ملغاة.\"\"\"\n",
    "    normalized = normalize_arabic_text(text)\n",
    "    return \"repealed\" if (\"ملغاة\" in normalized or \"ملغى\" in normalized) else \"active\"\n",
    "\n",
    "\n",
    "# نسخة تنظيف نهائية\n",
    "df_labor_law_clean = df_labor_law.copy()\n",
    "\n",
    "# تنظيف النصوص\n",
    "for col in [\"bab_label\", \"bab_title\", \"fasl\", \"article_title\", \"article_text\"]:\n",
    "    if col in df_labor_law_clean.columns:\n",
    "        df_labor_law_clean[col] = (\n",
    "            df_labor_law_clean[col]\n",
    "            .fillna(\"\")\n",
    "            .astype(str)\n",
    "            .apply(normalize_arabic_text)\n",
    "        )\n",
    "\n",
    "# قياسات ومؤشرات\n",
    "df_labor_law_clean[\"text_len\"] = df_labor_law_clean[\"article_text\"].str.len()\n",
    "df_labor_law_clean[\"article_status\"] = df_labor_law_clean[\"article_text\"].apply(detect_article_status)\n",
    "\n",
    "# مفتاح إزالة التكرار الحقيقي:\n",
    "# article_number_label يحافظ على مواد مثل 74مكرر ولا يخلطها مع 74\n",
    "if \"article_number_label\" not in df_labor_law_clean.columns:\n",
    "    df_labor_law_clean[\"article_number_label\"] = df_labor_law_clean[\"article_number_int\"].astype(str)\n",
    "\n",
    "df_labor_law_clean[\"article_unique_key\"] = (\n",
    "    df_labor_law_clean[\"article_number_label\"]\n",
    "    .fillna(\"\")\n",
    "    .astype(str)\n",
    "    .str.strip()\n",
    ")\n",
    "\n",
    "# احتياطياً لو كانت المادة بلا label واضح\n",
    "missing_key = df_labor_law_clean[\"article_unique_key\"].isin([\"\", \"None\", \"nan\", \"NaN\"])\n",
    "df_labor_law_clean.loc[missing_key, \"article_unique_key\"] = (\n",
    "    df_labor_law_clean.loc[missing_key, \"article_title\"]\n",
    "    .fillna(\"\")\n",
    "    .astype(str)\n",
    "    .str.strip()\n",
    ")\n",
    "\n",
    "rows_before = len(df_labor_law_clean)\n",
    "\n",
    "# إزالة التكرارات الحقيقية مع الاحتفاظ بأطول نص لكل مادة\n",
    "df_labor_law_clean = (\n",
    "    df_labor_law_clean\n",
    "    .sort_values([\"article_unique_key\", \"text_len\"], ascending=[True, False])\n",
    "    .drop_duplicates(subset=[\"article_unique_key\"], keep=\"first\")\n",
    "    .sort_values([\"article_number_int\", \"article_number_label\"], ascending=[True, True])\n",
    "    .reset_index(drop=True)\n",
    ")\n",
    "\n",
    "rows_after = len(df_labor_law_clean)\n",
    "\n",
    "# تحديث searchable_text بعد التنظيف\n",
    "if set([\"bab_label\", \"bab_title\", \"fasl\", \"article_title\", \"article_text\"]).issubset(df_labor_law_clean.columns):\n",
    "    df_labor_law_clean[\"searchable_text\"] = df_labor_law_clean.apply(\n",
    "        lambda row: normalize_arabic_text(\n",
    "            f\"{row['bab_label']} - {row['bab_title']} - {row['fasl']} - \"\n",
    "            f\"{row['article_title']} - {row['article_text']}\"\n",
    "        ),\n",
    "        axis=1\n",
    "    )\n",
    "\n",
    "# حذف المفتاح المساعد من الملف النهائي\n",
    "df_labor_law_clean = df_labor_law_clean.drop(columns=[\"article_unique_key\"], errors=\"ignore\")\n",
    "\n",
    "# فحص نهائي\n",
    "nums = set(df_labor_law_clean[\"article_number_int\"].dropna().astype(int))\n",
    "missing_articles = [n for n in range(1, 246) if n not in nums]\n",
    "true_duplicates = df_labor_law_clean[\"article_number_label\"].duplicated().sum()\n",
    "legal_repeated_numbers = df_labor_law_clean[\"article_number_int\"].duplicated().sum()\n",
    "empty_texts = (df_labor_law_clean[\"article_text\"].astype(str).str.strip() == \"\").sum()\n",
    "\n",
    "print(\"عدد الصفوف قبل إزالة التكرار:\", rows_before)\n",
    "print(\"عدد الصفوف بعد إزالة التكرار:\", rows_after)\n",
    "print(\"عدد المواد:\", len(nums), \"| الأعلى:\", max(nums) if nums else None)\n",
    "print(\"المفقود من 1 إلى 245:\", missing_articles)\n",
    "print(\"عدد التكرارات الحقيقية حسب article_number_label:\", true_duplicates)\n",
    "print(\"عدد مواد مكرر القانونية حسب article_number_int:\", legal_repeated_numbers)\n",
    "print(\"عدد المواد بدون نص:\", empty_texts)\n",
    "\n",
    "print(\"\\nتوزيع حالة المواد:\")\n",
    "display(df_labor_law_clean[\"article_status\"].value_counts().to_frame(\"count\"))\n",
    "\n",
    "print(\"\\nالمواد القصيرة غير الملغاة:\")\n",
    "display(\n",
    "    df_labor_law_clean[\n",
    "        (df_labor_law_clean[\"text_len\"] < 30) &\n",
    "        (df_labor_law_clean[\"article_status\"] != \"repealed\")\n",
    "    ][[\"article_number_int\", \"article_number_label\", \"article_title\", \"article_text\", \"text_len\", \"article_status\"]]\n",
    ")\n",
    "\n",
    "# حفظ نسخة قانونية مباشرة في نفس مجلد النوتبوك\n",
    "# وسيتم أيضاً حفظ نسخة موحدة داخل مجلد المشروع في آخر النوتبوك\n",
    "df_labor_law_clean.to_csv(LAW_OUTPUT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "df_labor_law_clean.to_excel(LAW_OUTPUT_XLSX, index=False)\n",
    "\n",
    "with open(LAW_OUTPUT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "    json.dump(df_labor_law_clean.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "print(\"\\nتم حفظ مواد نظام العمل النظيفة:\")\n",
    "print(LAW_OUTPUT_CSV)\n",
    "print(LAW_OUTPUT_XLSX)\n",
    "print(LAW_OUTPUT_JSON)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9384ddaa",
   "metadata": {},
   "source": [
    "## المرحلة 2: سحب الأسئلة الشائعة\n",
    "\n",
    "تفتح متصفحاً وتسحب كل الأسئلة الشائعة وتصنّفها حسب فلاتر الموقع، وتنتج المتغير df_faq.\n",
    "\n",
    "قد تأخذ وقتاً لأنها تمر على عشرات الصفحات وعدة فلاتر."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e5863ea0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "فتح صفحة الأسئلة الشائعة...\n",
      "\n",
      "استخراج خيارات الفلاتر...\n",
      "خيارات المستفيدين: 41\n",
      "خيارات القطاع: 4\n",
      "خيارات الموقع الفرعي: 3\n",
      "\n",
      "سحب جميع الأسئلة بدون فلتر...\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 11\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 12\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 10\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 12 | الجديد 12\n",
      "      صفحة 25: المستخرج 12 | الجديد 12\n",
      "      صفحة 26: المستخرج 12 | الجديد 12\n",
      "      صفحة 27: المستخرج 12 | الجديد 12\n",
      "      صفحة 28: المستخرج 12 | الجديد 12\n",
      "      صفحة 29: المستخرج 12 | الجديد 12\n",
      "      صفحة 30: المستخرج 12 | الجديد 12\n",
      "      صفحة 31: المستخرج 12 | الجديد 12\n",
      "      صفحة 32: المستخرج 12 | الجديد 12\n",
      "      صفحة 33: المستخرج 12 | الجديد 12\n",
      "      صفحة 34: المستخرج 12 | الجديد 12\n",
      "      صفحة 35: المستخرج 12 | الجديد 12\n",
      "      صفحة 36: المستخرج 12 | الجديد 12\n",
      "      صفحة 37: المستخرج 12 | الجديد 12\n",
      "      صفحة 38: المستخرج 11 | الجديد 11\n",
      "      صفحة 39: المستخرج 12 | الجديد 12\n",
      "      صفحة 40: المستخرج 12 | الجديد 12\n",
      "      صفحة 41: المستخرج 12 | الجديد 12\n",
      "      صفحة 42: المستخرج 12 | الجديد 12\n",
      "      صفحة 43: المستخرج 12 | الجديد 12\n",
      "      صفحة 44: المستخرج 12 | الجديد 12\n",
      "      صفحة 45: المستخرج 12 | الجديد 12\n",
      "      صفحة 46: المستخرج 12 | الجديد 12\n",
      "      صفحة 47: المستخرج 12 | الجديد 12\n",
      "      صفحة 48: المستخرج 12 | الجديد 12\n",
      "      صفحة 49: المستخرج 12 | الجديد 12\n",
      "      صفحة 50: المستخرج 12 | الجديد 12\n",
      "      صفحة 51: المستخرج 12 | الجديد 12\n",
      "      صفحة 52: المستخرج 12 | الجديد 12\n",
      "      صفحة 53: المستخرج 12 | الجديد 12\n",
      "      صفحة 54: المستخرج 12 | الجديد 12\n",
      "      صفحة 55: المستخرج 12 | الجديد 12\n",
      "      صفحة 56: المستخرج 12 | الجديد 12\n",
      "      صفحة 57: المستخرج 12 | الجديد 12\n",
      "      صفحة 58: المستخرج 12 | الجديد 11\n",
      "      صفحة 59: المستخرج 12 | الجديد 11\n",
      "      صفحة 60: المستخرج 9 | الجديد 9\n",
      "\n",
      "تصنيف الأسئلة حسب المستفيدين...\n",
      "  فلتر المستفيدين: مستفيدي التوجيه والتأهيل الاجتماعي\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: مستفيدي التنمية الاجتماعية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: أعمال\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 10 | الجديد 10\n",
      "  فلتر المستفيدين: أصحاب عمل\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 10\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 12\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 11 | الجديد 11\n",
      "      صفحة 16: المستخرج 2 | الجديد 2\n",
      "  فلتر المستفيدين: المواطنين\n",
      "      صفحة 1: المستخرج 4 | الجديد 4\n",
      "  فلتر المستفيدين: متقاعد\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: مستحقي الدعم\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: العمالة المنزلية\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 11\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 12\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 10\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 12 | الجديد 12\n",
      "      صفحة 25: المستخرج 12 | الجديد 12\n",
      "      صفحة 26: المستخرج 12 | الجديد 12\n",
      "      صفحة 27: المستخرج 12 | الجديد 12\n",
      "      صفحة 28: المستخرج 12 | الجديد 12\n",
      "      صفحة 29: المستخرج 12 | الجديد 12\n",
      "      صفحة 30: المستخرج 12 | الجديد 12\n",
      "      صفحة 31: المستخرج 12 | الجديد 12\n",
      "      صفحة 32: المستخرج 12 | الجديد 12\n",
      "      صفحة 33: المستخرج 12 | الجديد 12\n",
      "      صفحة 34: المستخرج 12 | الجديد 12\n",
      "      صفحة 35: المستخرج 12 | الجديد 12\n",
      "      صفحة 36: المستخرج 12 | الجديد 12\n",
      "      صفحة 37: المستخرج 12 | الجديد 12\n",
      "      صفحة 38: المستخرج 11 | الجديد 11\n",
      "      صفحة 39: المستخرج 12 | الجديد 12\n",
      "      صفحة 40: المستخرج 12 | الجديد 12\n",
      "      صفحة 41: المستخرج 12 | الجديد 12\n",
      "      صفحة 42: المستخرج 12 | الجديد 12\n",
      "      صفحة 43: المستخرج 12 | الجديد 12\n",
      "      صفحة 44: المستخرج 12 | الجديد 12\n",
      "      صفحة 45: المستخرج 12 | الجديد 12\n",
      "      صفحة 46: المستخرج 12 | الجديد 12\n",
      "      صفحة 47: المستخرج 12 | الجديد 12\n",
      "      صفحة 48: المستخرج 12 | الجديد 12\n",
      "      صفحة 49: المستخرج 12 | الجديد 12\n",
      "      صفحة 50: المستخرج 12 | الجديد 12\n",
      "      صفحة 51: المستخرج 12 | الجديد 12\n",
      "      صفحة 52: المستخرج 12 | الجديد 12\n",
      "      صفحة 53: المستخرج 12 | الجديد 12\n",
      "      صفحة 54: المستخرج 12 | الجديد 12\n",
      "      صفحة 55: المستخرج 12 | الجديد 12\n",
      "      صفحة 56: المستخرج 12 | الجديد 12\n",
      "      صفحة 57: المستخرج 12 | الجديد 12\n",
      "      صفحة 58: المستخرج 12 | الجديد 11\n",
      "      صفحة 59: المستخرج 12 | الجديد 11\n",
      "      صفحة 60: المستخرج 9 | الجديد 9\n",
      "  فلتر المستفيدين: تبرع\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: العمالة\n",
      "      صفحة 1: المستخرج 1 | الجديد 1\n",
      "  فلتر المستفيدين: حقوق العمالة في المملكة العربية السعودية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: عامل\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 4 | الجديد 4\n",
      "  فلتر المستفيدين: الأسر الحاضنة\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: الأسر الكافلة\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: التسوية الودية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: الجهات الحكومية\n",
      "      صفحة 1: المستخرج 4 | الجديد 4\n",
      "  فلتر المستفيدين: أفراد\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 10\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 12\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 12 | الجديد 12\n",
      "      صفحة 25: المستخرج 11 | الجديد 11\n",
      "      صفحة 26: المستخرج 12 | الجديد 12\n",
      "      صفحة 27: المستخرج 12 | الجديد 12\n",
      "      صفحة 28: المستخرج 12 | الجديد 12\n",
      "      صفحة 29: المستخرج 12 | الجديد 12\n",
      "      صفحة 30: المستخرج 12 | الجديد 12\n",
      "      صفحة 31: المستخرج 12 | الجديد 12\n",
      "      صفحة 32: المستخرج 12 | الجديد 12\n",
      "      صفحة 33: المستخرج 12 | الجديد 12\n",
      "      صفحة 34: المستخرج 12 | الجديد 12\n",
      "      صفحة 35: المستخرج 12 | الجديد 12\n",
      "      صفحة 36: المستخرج 12 | الجديد 12\n",
      "      صفحة 37: المستخرج 12 | الجديد 12\n",
      "      صفحة 38: المستخرج 12 | الجديد 12\n",
      "      صفحة 39: المستخرج 12 | الجديد 12\n",
      "      صفحة 40: المستخرج 12 | الجديد 12\n",
      "      صفحة 41: المستخرج 12 | الجديد 12\n",
      "      صفحة 42: المستخرج 12 | الجديد 12\n",
      "      صفحة 43: المستخرج 12 | الجديد 12\n",
      "      صفحة 44: المستخرج 12 | الجديد 12\n",
      "      صفحة 45: المستخرج 12 | الجديد 11\n",
      "      صفحة 46: المستخرج 12 | الجديد 11\n",
      "      صفحة 47: المستخرج 3 | الجديد 3\n",
      "  فلتر المستفيدين: الباحثين عن عمل\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: الملحقيات العمالية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: التوطين\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: localization violations\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: ‏جهات غير ربحية ‏\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: الأيتام\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: ذوي الإعاقة\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 2 | الجديد 2\n",
      "  فلتر المستفيدين: جهات خاصة\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: موظفي القطاع العام\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: حديثي التخرج\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: مقيمين\n",
      "      صفحة 1: المستخرج 4 | الجديد 4\n",
      "  فلتر المستفيدين: المناطق الريفية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: التخصصات الاجتماعية\n",
      "      صفحة 1: المستخرج 12 | الجديد 11\n",
      "      صفحة 2: المستخرج 11 | الجديد 11\n",
      "  فلتر المستفيدين: مستفيدي الضمان الاجتماعي\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: نظام الخدمة المدينة بالمملكة العربية والسعودية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: كبار السن\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 11\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 12\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 10\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 12 | الجديد 12\n",
      "      صفحة 25: المستخرج 12 | الجديد 12\n",
      "      صفحة 26: المستخرج 12 | الجديد 12\n",
      "      صفحة 27: المستخرج 12 | الجديد 12\n",
      "      صفحة 28: المستخرج 12 | الجديد 12\n",
      "      صفحة 29: المستخرج 12 | الجديد 12\n",
      "      صفحة 30: المستخرج 12 | الجديد 12\n",
      "      صفحة 31: المستخرج 12 | الجديد 12\n",
      "      صفحة 32: المستخرج 12 | الجديد 12\n",
      "      صفحة 33: المستخرج 12 | الجديد 12\n",
      "      صفحة 34: المستخرج 12 | الجديد 12\n",
      "      صفحة 35: المستخرج 12 | الجديد 12\n",
      "      صفحة 36: المستخرج 12 | الجديد 12\n",
      "      صفحة 37: المستخرج 12 | الجديد 12\n",
      "      صفحة 38: المستخرج 11 | الجديد 11\n",
      "      صفحة 39: المستخرج 12 | الجديد 12\n",
      "      صفحة 40: المستخرج 12 | الجديد 12\n",
      "      صفحة 41: المستخرج 12 | الجديد 12\n",
      "      صفحة 42: المستخرج 12 | الجديد 12\n",
      "      صفحة 43: المستخرج 12 | الجديد 12\n",
      "      صفحة 44: المستخرج 12 | الجديد 12\n",
      "      صفحة 45: المستخرج 12 | الجديد 12\n",
      "      صفحة 46: المستخرج 12 | الجديد 12\n",
      "      صفحة 47: المستخرج 12 | الجديد 12\n",
      "      صفحة 48: المستخرج 12 | الجديد 12\n",
      "      صفحة 49: المستخرج 12 | الجديد 12\n",
      "      صفحة 50: المستخرج 12 | الجديد 12\n",
      "      صفحة 51: المستخرج 12 | الجديد 12\n",
      "      صفحة 52: المستخرج 12 | الجديد 12\n",
      "      صفحة 53: المستخرج 12 | الجديد 12\n",
      "      صفحة 54: المستخرج 12 | الجديد 12\n",
      "      صفحة 55: المستخرج 12 | الجديد 12\n",
      "      صفحة 56: المستخرج 12 | الجديد 12\n",
      "      صفحة 57: المستخرج 12 | الجديد 12\n",
      "      صفحة 58: المستخرج 12 | الجديد 11\n",
      "      صفحة 59: المستخرج 12 | الجديد 11\n",
      "      صفحة 60: المستخرج 9 | الجديد 9\n",
      "  فلتر المستفيدين: المقابل المالي\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: نظام العمل في المملكة العربية السعودية\n",
      "      صفحة 1: المستخرج 1 | الجديد 1\n",
      "  فلتر المستفيدين: نظام التنمية الاجتماعية بالمملكة العربية والسعودية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: الزائرين\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: العمل التطوعي\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر المستفيدين: مستفيدي الضمان\n",
      "      صفحة 1: المستخرج 2 | الجديد 2\n",
      "  فلتر المستفيدين: امرأة\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 11\n",
      "      صفحة 4: المستخرج 12 | الجديد 11\n",
      "      صفحة 5: المستخرج 9 | الجديد 9\n",
      "  فلتر المستفيدين: شباب\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 11\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 11\n",
      "      صفحة 5: المستخرج 2 | الجديد 2\n",
      "\n",
      "تصنيف الأسئلة حسب القطاع...\n",
      "  فلتر القطاع: قطاع الخدمات المشتركة\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر القطاع: قطاع العمل\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 10\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 12\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 11 | الجديد 11\n",
      "      صفحة 25: المستخرج 4 | الجديد 4\n",
      "  فلتر القطاع: قطاع التنمية الاجتماعية\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 11\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 11\n",
      "      صفحة 11: المستخرج 1 | الجديد 1\n",
      "  فلتر القطاع: قطاع الخدمة المدنية (العام)\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 12\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 9\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 11\n",
      "      صفحة 8: المستخرج 12 | الجديد 10\n",
      "      صفحة 9: المستخرج 12 | الجديد 10\n",
      "      صفحة 10: المستخرج 12 | الجديد 10\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 9\n",
      "      صفحة 13: المستخرج 12 | الجديد 5\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 12\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 8 | الجديد 8\n",
      "\n",
      "تصنيف الأسئلة حسب الموقع الفرعي...\n",
      "  فلتر الموقع الفرعي: الثقافة العمالية\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "  فلتر الموقع الفرعي: مركز الرياض للسياسات السلوكية\n",
      "      صفحة 1: المستخرج 12 | الجديد 12\n",
      "      صفحة 2: المستخرج 12 | الجديد 11\n",
      "      صفحة 3: المستخرج 12 | الجديد 12\n",
      "      صفحة 4: المستخرج 12 | الجديد 12\n",
      "      صفحة 5: المستخرج 12 | الجديد 12\n",
      "      صفحة 6: المستخرج 12 | الجديد 12\n",
      "      صفحة 7: المستخرج 12 | الجديد 12\n",
      "      صفحة 8: المستخرج 12 | الجديد 12\n",
      "      صفحة 9: المستخرج 12 | الجديد 12\n",
      "      صفحة 10: المستخرج 12 | الجديد 12\n",
      "      صفحة 11: المستخرج 12 | الجديد 12\n",
      "      صفحة 12: المستخرج 12 | الجديد 12\n",
      "      صفحة 13: المستخرج 12 | الجديد 12\n",
      "      صفحة 14: المستخرج 12 | الجديد 12\n",
      "      صفحة 15: المستخرج 12 | الجديد 12\n",
      "      صفحة 16: المستخرج 12 | الجديد 12\n",
      "      صفحة 17: المستخرج 12 | الجديد 10\n",
      "      صفحة 18: المستخرج 12 | الجديد 12\n",
      "      صفحة 19: المستخرج 12 | الجديد 12\n",
      "      صفحة 20: المستخرج 12 | الجديد 12\n",
      "      صفحة 21: المستخرج 12 | الجديد 12\n",
      "      صفحة 22: المستخرج 12 | الجديد 12\n",
      "      صفحة 23: المستخرج 12 | الجديد 12\n",
      "      صفحة 24: المستخرج 12 | الجديد 12\n",
      "      صفحة 25: المستخرج 12 | الجديد 12\n",
      "      صفحة 26: المستخرج 12 | الجديد 12\n",
      "      صفحة 27: المستخرج 12 | الجديد 12\n",
      "      صفحة 28: المستخرج 12 | الجديد 12\n",
      "      صفحة 29: المستخرج 12 | الجديد 12\n",
      "      صفحة 30: المستخرج 12 | الجديد 12\n",
      "      صفحة 31: المستخرج 12 | الجديد 12\n",
      "      صفحة 32: المستخرج 12 | الجديد 12\n",
      "      صفحة 33: المستخرج 12 | الجديد 12\n",
      "      صفحة 34: المستخرج 12 | الجديد 12\n",
      "      صفحة 35: المستخرج 12 | الجديد 12\n",
      "      صفحة 36: المستخرج 12 | الجديد 12\n",
      "      صفحة 37: المستخرج 12 | الجديد 12\n",
      "      صفحة 38: المستخرج 11 | الجديد 11\n",
      "      صفحة 39: المستخرج 12 | الجديد 12\n",
      "      صفحة 40: المستخرج 12 | الجديد 12\n",
      "      صفحة 41: المستخرج 12 | الجديد 12\n",
      "      صفحة 42: المستخرج 12 | الجديد 12\n",
      "      صفحة 43: المستخرج 12 | الجديد 12\n",
      "      صفحة 44: المستخرج 12 | الجديد 12\n",
      "      صفحة 45: المستخرج 12 | الجديد 12\n",
      "      صفحة 46: المستخرج 12 | الجديد 12\n",
      "      صفحة 47: المستخرج 12 | الجديد 12\n",
      "      صفحة 48: المستخرج 12 | الجديد 12\n",
      "      صفحة 49: المستخرج 12 | الجديد 12\n",
      "      صفحة 50: المستخرج 12 | الجديد 12\n",
      "      صفحة 51: المستخرج 12 | الجديد 12\n",
      "      صفحة 52: المستخرج 12 | الجديد 12\n",
      "      صفحة 53: المستخرج 12 | الجديد 12\n",
      "      صفحة 54: المستخرج 12 | الجديد 12\n",
      "      صفحة 55: المستخرج 12 | الجديد 12\n",
      "      صفحة 56: المستخرج 12 | الجديد 12\n",
      "      صفحة 57: المستخرج 12 | الجديد 12\n",
      "      صفحة 58: المستخرج 12 | الجديد 11\n",
      "      صفحة 59: المستخرج 12 | الجديد 11\n",
      "      صفحة 60: المستخرج 9 | الجديد 9\n",
      "  فلتر الموقع الفرعي: المهارات والمهن\n",
      "      صفحة 1: المستخرج 0 | الجديد 0\n",
      "\n",
      "تم الانتهاء\n",
      "عدد الأسئلة النهائي: 711\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>faq_id</th>\n",
       "      <th>question</th>\n",
       "      <th>answer</th>\n",
       "      <th>beneficiaries</th>\n",
       "      <th>sector</th>\n",
       "      <th>subsite</th>\n",
       "      <th>page_number</th>\n",
       "      <th>page_url</th>\n",
       "      <th>source</th>\n",
       "      <th>searchable_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>هل تستخدم البوابة والانظمة التابعة لها الحلول ...</td>\n",
       "      <td>تقدم الوزارة خدمة التوقيع الالكتروني في اطار ا...</td>\n",
       "      <td>أصحاب عمل | أفراد | العمالة المنزلية | كبار السن</td>\n",
       "      <td>قطاع العمل</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: أصحاب عمل | أفراد | العمالة المنزلية ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟</td>\n",
       "      <td>الدخول إلى “مهامي” ← اختيار مهمة طلب مراجعة ← ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>ماذا يحدث بعد إرسال الطلب؟</td>\n",
       "      <td>يتم تحويل الطلب إلى اللجنة للمراجعة ويتم إشعار...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>كيف أقدم طلب تعديل فئة مهنية؟</td>\n",
       "      <td>من خلال تسجيل الدخول ← الخدمات ← اختيار “طلب ت...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>ما متطلبات التقديم؟</td>\n",
       "      <td>أن يكون المتقدم حاصل على ترخيص سابق.</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>من يمكنه التقديم على خدمة تعديل الفئة المهنية؟</td>\n",
       "      <td>الممارس الحاصل على ترخيص من خلال خدمة التسجيل ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...</td>\n",
       "      <td>نعم، يمكن للمتقدم الحصول على أكثر من رخصة إذا ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...</td>\n",
       "      <td>نعم، يحق لك استرداد رسوم خدمة التسجيل والتصنيف...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>ماذا يحدث في حال رفض الطلب؟</td>\n",
       "      <td>يمكنك الاطلاع على سبب الرفض من خلال تفاصيل الط...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>هل يمكن إلغاء الفاتورة؟</td>\n",
       "      <td>نعم، يمكن إلغاء الفاتورة قبل السداد، مع ضرورة ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>كيف أعرف حالة طلبي؟</td>\n",
       "      <td>يمكنك متابعة حالة الطلب من خلال صفحة “طلباتي” ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>ماذا يحدث بعد قبول الطلب؟</td>\n",
       "      <td>قد يتم: قبول مباشر وإصدار الرخصة قبول مباشر وإ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>1</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>ما هي حالات الطلب؟</td>\n",
       "      <td>تحت الإجراء تحت الإجراء مرفوض مرفوض مكتمل مكتمل</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>هل يشترط إرفاق خطاب جهة العمل؟</td>\n",
       "      <td>نعم، يجب إرفاق خطاب جهة العمل لكل خبرة عملية م...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>ما هي صيغة وحجم الملفات المسموح بها؟</td>\n",
       "      <td>الصيغ المقبولة: PDF – JPEG – PNG الصيغ المقبول...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟</td>\n",
       "      <td>يمكنك إدخال البيانات يدويًا وإرفاق المستندات ا...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>هل يمكن تعديل الطلب بعد إرساله؟</td>\n",
       "      <td>لا يمكن تعديل الطلب بعد الإرسال، إلا في حال تم...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>هل يمكن حفظ الطلب قبل الإرسال؟</td>\n",
       "      <td>نعم، يمكن حفظ الطلب كـ مسودة واستكماله لاحقًا.</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>هل الخدمة (التسجيل والتصنيف المهني) فورية؟</td>\n",
       "      <td>تقديم الطلب فوري، أما الطلب فيخضع للمراجعة.</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20</td>\n",
       "      <td>من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...</td>\n",
       "      <td>يمكن لأي ممارس حاصل على مؤهل علمي أو دورة تدري...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "      <td>2</td>\n",
       "      <td>https://www.hrsd.gov.sa/contact-us/faq</td>\n",
       "      <td>HRSD FAQ</td>\n",
       "      <td>التصنيف: التخصصات الاجتماعية | العمالة المنزلي...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    faq_id                                           question  \\\n",
       "0        1  هل تستخدم البوابة والانظمة التابعة لها الحلول ...   \n",
       "1        2             ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟   \n",
       "2        3                         ماذا يحدث بعد إرسال الطلب؟   \n",
       "3        4                      كيف أقدم طلب تعديل فئة مهنية؟   \n",
       "4        5                                ما متطلبات التقديم؟   \n",
       "5        6     من يمكنه التقديم على خدمة تعديل الفئة المهنية؟   \n",
       "6        7  هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...   \n",
       "7        8  إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...   \n",
       "8        9                        ماذا يحدث في حال رفض الطلب؟   \n",
       "9       10                            هل يمكن إلغاء الفاتورة؟   \n",
       "10      11                                كيف أعرف حالة طلبي؟   \n",
       "11      12                          ماذا يحدث بعد قبول الطلب؟   \n",
       "12      13                                 ما هي حالات الطلب؟   \n",
       "13      14                     هل يشترط إرفاق خطاب جهة العمل؟   \n",
       "14      15               ما هي صيغة وحجم الملفات المسموح بها؟   \n",
       "15      16         ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟   \n",
       "16      17                    هل يمكن تعديل الطلب بعد إرساله؟   \n",
       "17      18                     هل يمكن حفظ الطلب قبل الإرسال؟   \n",
       "18      19         هل الخدمة (التسجيل والتصنيف المهني) فورية؟   \n",
       "19      20  من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...   \n",
       "\n",
       "                                               answer  \\\n",
       "0   تقدم الوزارة خدمة التوقيع الالكتروني في اطار ا...   \n",
       "1   الدخول إلى “مهامي” ← اختيار مهمة طلب مراجعة ← ...   \n",
       "2   يتم تحويل الطلب إلى اللجنة للمراجعة ويتم إشعار...   \n",
       "3   من خلال تسجيل الدخول ← الخدمات ← اختيار “طلب ت...   \n",
       "4                أن يكون المتقدم حاصل على ترخيص سابق.   \n",
       "5   الممارس الحاصل على ترخيص من خلال خدمة التسجيل ...   \n",
       "6   نعم، يمكن للمتقدم الحصول على أكثر من رخصة إذا ...   \n",
       "7   نعم، يحق لك استرداد رسوم خدمة التسجيل والتصنيف...   \n",
       "8   يمكنك الاطلاع على سبب الرفض من خلال تفاصيل الط...   \n",
       "9   نعم، يمكن إلغاء الفاتورة قبل السداد، مع ضرورة ...   \n",
       "10  يمكنك متابعة حالة الطلب من خلال صفحة “طلباتي” ...   \n",
       "11  قد يتم: قبول مباشر وإصدار الرخصة قبول مباشر وإ...   \n",
       "12    تحت الإجراء تحت الإجراء مرفوض مرفوض مكتمل مكتمل   \n",
       "13  نعم، يجب إرفاق خطاب جهة العمل لكل خبرة عملية م...   \n",
       "14  الصيغ المقبولة: PDF – JPEG – PNG الصيغ المقبول...   \n",
       "15  يمكنك إدخال البيانات يدويًا وإرفاق المستندات ا...   \n",
       "16  لا يمكن تعديل الطلب بعد الإرسال، إلا في حال تم...   \n",
       "17     نعم، يمكن حفظ الطلب كـ مسودة واستكماله لاحقًا.   \n",
       "18        تقديم الطلب فوري، أما الطلب فيخضع للمراجعة.   \n",
       "19  يمكن لأي ممارس حاصل على مؤهل علمي أو دورة تدري...   \n",
       "\n",
       "                                        beneficiaries  \\\n",
       "0    أصحاب عمل | أفراد | العمالة المنزلية | كبار السن   \n",
       "1   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "2   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "3   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "4   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "5   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "6   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "7   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "8   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "9   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "10  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "11  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "12  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "13  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "14  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "15  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "16  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "17  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "18  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "19  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "\n",
       "                     sector                        subsite  page_number  \\\n",
       "0                قطاع العمل  مركز الرياض للسياسات السلوكية            1   \n",
       "1   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "2   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "3   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "4   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "5                            مركز الرياض للسياسات السلوكية            1   \n",
       "6   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "7   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "8                            مركز الرياض للسياسات السلوكية            1   \n",
       "9   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "10                           مركز الرياض للسياسات السلوكية            1   \n",
       "11  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            1   \n",
       "12  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "13  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "14  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "15  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "16  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "17  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "18  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "19  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية            2   \n",
       "\n",
       "                                  page_url    source  \\\n",
       "0   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "1   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "2   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "3   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "4   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "5   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "6   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "7   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "8   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "9   https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "10  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "11  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "12  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "13  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "14  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "15  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "16  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "17  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "18  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "19  https://www.hrsd.gov.sa/contact-us/faq  HRSD FAQ   \n",
       "\n",
       "                                      searchable_text  \n",
       "0   التصنيف: أصحاب عمل | أفراد | العمالة المنزلية ...  \n",
       "1   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "2   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "3   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "4   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "5   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "6   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "7   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "8   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "9   التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "10  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "11  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "12  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "13  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "14  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "15  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "16  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "17  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "18  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  \n",
       "19  التصنيف: التخصصات الاجتماعية | العمالة المنزلي...  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# =========================================================\n",
    "# HRSD FAQ Scraper with Filters as Classification Columns\n",
    "# يسحب الأسئلة + الأجوبة + تصنيف المستفيدين + القطاع + الموقع الفرعي\n",
    "# =========================================================\n",
    "\n",
    "# أول مرة فقط:\n",
    "# !pip install selenium beautifulsoup4 pandas openpyxl lxml\n",
    "\n",
    "import re\n",
    "import time\n",
    "import json\n",
    "import pandas as pd\n",
    "\n",
    "from bs4 import BeautifulSoup\n",
    "\n",
    "from selenium import webdriver\n",
    "from selenium.webdriver.common.by import By\n",
    "from selenium.webdriver.chrome.options import Options\n",
    "from selenium.webdriver.support.ui import Select, WebDriverWait\n",
    "from selenium.common.exceptions import NoSuchElementException, TimeoutException\n",
    "\n",
    "\n",
    "BASE_URL = \"https://www.hrsd.gov.sa/contact-us/faq\"\n",
    "TOTAL_PAGES = 60\n",
    "\n",
    "FAQ_OUTPUT_CSV = \"hrsd_faq_with_filters_classification.csv\"\n",
    "FAQ_OUTPUT_XLSX = \"hrsd_faq_with_filters_classification.xlsx\"\n",
    "FAQ_OUTPUT_JSON = \"hrsd_faq_with_filters_classification.json\"\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Basic Helpers\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def clean_text(text):\n",
    "    if text is None:\n",
    "        return \"\"\n",
    "    text = text.replace(\"\\xa0\", \" \")\n",
    "    text = re.sub(r\"\\s+\", \" \", text)\n",
    "    return text.strip()\n",
    "\n",
    "\n",
    "def normalize_key(question, answer):\n",
    "    \"\"\"\n",
    "    مفتاح ثابت لمطابقة نفس السؤال والجواب حتى لو كان فيه اختلاف مسافات.\n",
    "    \"\"\"\n",
    "    q = clean_text(question)\n",
    "    a = clean_text(answer)\n",
    "    return f\"{q}|||{a}\"\n",
    "\n",
    "\n",
    "def setup_driver(headless=False):\n",
    "    chrome_options = Options()\n",
    "\n",
    "    if headless:\n",
    "        chrome_options.add_argument(\"--headless=new\")\n",
    "\n",
    "    chrome_options.add_argument(\"--start-maximized\")\n",
    "    chrome_options.add_argument(\"--disable-gpu\")\n",
    "    chrome_options.add_argument(\"--no-sandbox\")\n",
    "    chrome_options.add_argument(\"--lang=ar-SA\")\n",
    "    chrome_options.add_argument(\"--disable-dev-shm-usage\")\n",
    "\n",
    "    driver = webdriver.Chrome(options=chrome_options)\n",
    "    return driver\n",
    "\n",
    "\n",
    "def wait_page_ready(driver, seconds=30):\n",
    "    WebDriverWait(driver, seconds).until(\n",
    "        lambda d: \"الأسئلة الشائعة\" in d.page_source\n",
    "    )\n",
    "    time.sleep(1.5)\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Extract FAQ from current HTML\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def extract_faqs_from_html(html, page_number, current_url):\n",
    "    soup = BeautifulSoup(html, \"lxml\")\n",
    "\n",
    "    for tag in soup([\"script\", \"style\", \"noscript\", \"svg\"]):\n",
    "        tag.decompose()\n",
    "\n",
    "    h1 = None\n",
    "    for candidate in soup.find_all(\"h1\"):\n",
    "        if \"الأسئلة الشائعة\" in clean_text(candidate.get_text(\" \")):\n",
    "            h1 = candidate\n",
    "            break\n",
    "\n",
    "    if h1 is None:\n",
    "        return []\n",
    "\n",
    "    rows = []\n",
    "\n",
    "    current_question = None\n",
    "    current_answer_parts = []\n",
    "\n",
    "    def flush():\n",
    "        nonlocal current_question, current_answer_parts\n",
    "\n",
    "        answer = clean_text(\" \".join(current_answer_parts))\n",
    "\n",
    "        if current_question and answer:\n",
    "            rows.append({\n",
    "                \"question\": current_question,\n",
    "                \"answer\": answer,\n",
    "                \"page_number\": page_number,\n",
    "                \"page_url\": current_url,\n",
    "                \"source\": \"HRSD FAQ\",\n",
    "                \"searchable_text\": clean_text(\n",
    "                    f\"السؤال: {current_question} الإجابة: {answer}\"\n",
    "                )\n",
    "            })\n",
    "\n",
    "        current_question = None\n",
    "        current_answer_parts = []\n",
    "\n",
    "    stop_markers = [\n",
    "        \"Pagination\",\n",
    "        \"تمثل صفحة المستفيد\",\n",
    "        \"تاريخ آخر تحديث\",\n",
    "        \"هل كانت هذه الصفحة مفيدة\",\n",
    "        \"جميع الحقوق محفوظة\",\n",
    "        \"تابعنا على\",\n",
    "        \"تطبيقات الوزارة\"\n",
    "    ]\n",
    "\n",
    "    ignore_lines = {\n",
    "        \"العنوان\",\n",
    "        \"المستفيدين\",\n",
    "        \"القطاع\",\n",
    "        \"الموقع الفرعي\",\n",
    "        \"ترتيب حسب\",\n",
    "        \"- اختر -\",\n",
    "        \"أحدث\",\n",
    "        \"الأقدم\",\n",
    "        \"العنوان (أ - ي)\",\n",
    "        \"العنوان (ي - أ)\",\n",
    "        \"Next page\",\n",
    "        \"Previous page\",\n",
    "        \"…\",\n",
    "    }\n",
    "\n",
    "    # لا نستخدم div حتى لا يتكرر كامل محتوى الصفحة\n",
    "    tags = h1.find_all_next([\"h2\", \"h3\", \"h4\", \"p\", \"li\"])\n",
    "\n",
    "    for tag in tags:\n",
    "        text = clean_text(tag.get_text(\" \"))\n",
    "\n",
    "        if not text:\n",
    "            continue\n",
    "\n",
    "        if text in ignore_lines:\n",
    "            continue\n",
    "\n",
    "        if re.fullmatch(r\"Page\\s+\\d+\", text, re.IGNORECASE):\n",
    "            continue\n",
    "\n",
    "        if any(marker in text for marker in stop_markers):\n",
    "            flush()\n",
    "            break\n",
    "\n",
    "        # السؤال غالباً h2\n",
    "        if tag.name == \"h2\":\n",
    "            flush()\n",
    "            current_question = text\n",
    "            current_answer_parts = []\n",
    "            continue\n",
    "\n",
    "        # الجواب بعد السؤال\n",
    "        if current_question and tag.name in [\"p\", \"li\"]:\n",
    "            current_answer_parts.append(text)\n",
    "\n",
    "    flush()\n",
    "    return rows\n",
    "\n",
    "\n",
    "def get_first_question(driver):\n",
    "    rows = extract_faqs_from_html(driver.page_source, page_number=0, current_url=driver.current_url)\n",
    "    if not rows:\n",
    "        return \"\"\n",
    "    return rows[0][\"question\"]\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Pagination\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def click_next_page(driver):\n",
    "    \"\"\"\n",
    "    الضغط على Next page فعلياً.\n",
    "    \"\"\"\n",
    "\n",
    "    xpaths = [\n",
    "        \"//a[@rel='next']\",\n",
    "        \"//a[contains(@aria-label, 'Next page')]\",\n",
    "        \"//a[contains(@title, 'Next page')]\",\n",
    "        \"//a[contains(normalize-space(.), 'Next page')]\",\n",
    "        \"//button[contains(normalize-space(.), 'Next page')]\",\n",
    "        \"//a[contains(normalize-space(.), 'التالي')]\",\n",
    "        \"//button[contains(normalize-space(.), 'التالي')]\",\n",
    "    ]\n",
    "\n",
    "    next_element = None\n",
    "\n",
    "    for xp in xpaths:\n",
    "        elements = driver.find_elements(By.XPATH, xp)\n",
    "        elements = [e for e in elements if e.is_displayed() and e.is_enabled()]\n",
    "        if elements:\n",
    "            next_element = elements[-1]\n",
    "            break\n",
    "\n",
    "    if next_element is None:\n",
    "        return False\n",
    "\n",
    "    driver.execute_script(\n",
    "        \"arguments[0].scrollIntoView({block: 'center'});\",\n",
    "        next_element\n",
    "    )\n",
    "    time.sleep(0.5)\n",
    "\n",
    "    old_first = get_first_question(driver)\n",
    "\n",
    "    driver.execute_script(\"arguments[0].click();\", next_element)\n",
    "\n",
    "    try:\n",
    "        WebDriverWait(driver, 20).until(\n",
    "            lambda d: get_first_question(d) != old_first\n",
    "        )\n",
    "    except:\n",
    "        time.sleep(3)\n",
    "\n",
    "    return True\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Filter Options Extraction\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def get_visible_lines_from_html(html):\n",
    "    soup = BeautifulSoup(html, \"lxml\")\n",
    "\n",
    "    for tag in soup([\"script\", \"style\", \"noscript\", \"svg\"]):\n",
    "        tag.decompose()\n",
    "\n",
    "    text = soup.get_text(\"\\n\")\n",
    "    lines = [clean_text(x) for x in text.split(\"\\n\")]\n",
    "    lines = [x for x in lines if x]\n",
    "\n",
    "    return lines\n",
    "\n",
    "\n",
    "def extract_options_between(lines, start_label, end_label):\n",
    "    \"\"\"\n",
    "    استخراج خيارات الفلتر من النص الظاهر:\n",
    "    مثلا بين \"المستفيدين\" و \"القطاع\"\n",
    "    \"\"\"\n",
    "    if start_label not in lines:\n",
    "        return []\n",
    "\n",
    "    start_idx = lines.index(start_label) + 1\n",
    "\n",
    "    if end_label in lines:\n",
    "        end_idx = lines.index(end_label)\n",
    "    else:\n",
    "        end_idx = len(lines)\n",
    "\n",
    "    options = lines[start_idx:end_idx]\n",
    "\n",
    "    options = [\n",
    "        x for x in options\n",
    "        if x not in [\"- اختر -\", \"\", \"العنوان\"]\n",
    "    ]\n",
    "\n",
    "    # إزالة التكرار مع الحفاظ على الترتيب\n",
    "    seen = set()\n",
    "    clean_options = []\n",
    "\n",
    "    for opt in options:\n",
    "        if opt not in seen:\n",
    "            seen.add(opt)\n",
    "            clean_options.append(opt)\n",
    "\n",
    "    return clean_options\n",
    "\n",
    "\n",
    "def get_filter_options(driver):\n",
    "    \"\"\"\n",
    "    استخراج خيارات الفلاتر الموجودة في الصفحة.\n",
    "    \"\"\"\n",
    "    lines = get_visible_lines_from_html(driver.page_source)\n",
    "\n",
    "    beneficiaries = extract_options_between(lines, \"المستفيدين\", \"القطاع\")\n",
    "    sectors = extract_options_between(lines, \"القطاع\", \"الموقع الفرعي\")\n",
    "    subsites = extract_options_between(lines, \"الموقع الفرعي\", \"ترتيب حسب\")\n",
    "    sort_options = extract_options_between(lines, \"ترتيب حسب\", get_first_question(driver))\n",
    "\n",
    "    return {\n",
    "        \"beneficiaries\": beneficiaries,\n",
    "        \"sectors\": sectors,\n",
    "        \"subsites\": subsites,\n",
    "        \"sort_options\": sort_options,\n",
    "    }\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Apply Filter\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def try_select_native_dropdown(driver, label_text, option_text):\n",
    "    \"\"\"\n",
    "    يحاول اختيار الفلتر إذا كان HTML select عادي.\n",
    "    \"\"\"\n",
    "    try:\n",
    "        select_el = driver.find_element(\n",
    "            By.XPATH,\n",
    "            f\"//*[normalize-space()='{label_text}']/following::select[1]\"\n",
    "        )\n",
    "\n",
    "        driver.execute_script(\n",
    "            \"arguments[0].scrollIntoView({block: 'center'});\",\n",
    "            select_el\n",
    "        )\n",
    "        time.sleep(0.3)\n",
    "\n",
    "        Select(select_el).select_by_visible_text(option_text)\n",
    "\n",
    "        driver.execute_script(\n",
    "            \"\"\"\n",
    "            arguments[0].dispatchEvent(new Event('change', {bubbles: true}));\n",
    "            arguments[0].dispatchEvent(new Event('input', {bubbles: true}));\n",
    "            \"\"\",\n",
    "            select_el\n",
    "        )\n",
    "\n",
    "        return True\n",
    "\n",
    "    except Exception:\n",
    "        return False\n",
    "\n",
    "\n",
    "def try_select_custom_dropdown(driver, label_text, option_text):\n",
    "    \"\"\"\n",
    "    يحاول اختيار الفلتر إذا كان Dropdown مخصص وليس select.\n",
    "    \"\"\"\n",
    "    try:\n",
    "        # أقرب عنصر قابل للضغط بعد عنوان الفلتر\n",
    "        dropdown = driver.find_element(\n",
    "            By.XPATH,\n",
    "            f\"//*[normalize-space()='{label_text}']/following::*[self::button or @role='combobox' or contains(@class,'select')][1]\"\n",
    "        )\n",
    "\n",
    "        driver.execute_script(\n",
    "            \"arguments[0].scrollIntoView({block: 'center'});\",\n",
    "            dropdown\n",
    "        )\n",
    "        time.sleep(0.5)\n",
    "\n",
    "        driver.execute_script(\"arguments[0].click();\", dropdown)\n",
    "        time.sleep(0.7)\n",
    "\n",
    "        option = driver.find_element(\n",
    "            By.XPATH,\n",
    "            f\"//*[normalize-space()='{option_text}']\"\n",
    "        )\n",
    "\n",
    "        driver.execute_script(\n",
    "            \"arguments[0].scrollIntoView({block: 'center'});\",\n",
    "            option\n",
    "        )\n",
    "        time.sleep(0.3)\n",
    "\n",
    "        driver.execute_script(\"arguments[0].click();\", option)\n",
    "        return True\n",
    "\n",
    "    except Exception:\n",
    "        return False\n",
    "\n",
    "\n",
    "def click_apply_or_wait(driver):\n",
    "    \"\"\"\n",
    "    بعض الصفحات تطبق الفلتر تلقائياً، وبعضها تحتاج زر بحث/تطبيق.\n",
    "    \"\"\"\n",
    "    possible_buttons = [\n",
    "        \"//button[contains(normalize-space(.), 'تطبيق')]\",\n",
    "        \"//input[@type='submit' and contains(@value, 'تطبيق')]\",\n",
    "        \"//button[contains(normalize-space(.), 'بحث')]\",\n",
    "        \"//input[@type='submit' and contains(@value, 'بحث')]\",\n",
    "        \"//button[contains(normalize-space(.), 'Apply')]\",\n",
    "        \"//input[@type='submit' and contains(@value, 'Apply')]\",\n",
    "    ]\n",
    "\n",
    "    clicked = False\n",
    "\n",
    "    for xp in possible_buttons:\n",
    "        buttons = driver.find_elements(By.XPATH, xp)\n",
    "        buttons = [b for b in buttons if b.is_displayed() and b.is_enabled()]\n",
    "        if buttons:\n",
    "            driver.execute_script(\n",
    "                \"arguments[0].scrollIntoView({block: 'center'});\",\n",
    "                buttons[0]\n",
    "            )\n",
    "            time.sleep(0.3)\n",
    "            driver.execute_script(\"arguments[0].click();\", buttons[0])\n",
    "            clicked = True\n",
    "            break\n",
    "\n",
    "    time.sleep(2.5)\n",
    "    return clicked\n",
    "\n",
    "\n",
    "def apply_filter(driver, label_text, option_text):\n",
    "    \"\"\"\n",
    "    تطبيق فلتر واحد.\n",
    "    \"\"\"\n",
    "    old_first = get_first_question(driver)\n",
    "\n",
    "    ok = try_select_native_dropdown(driver, label_text, option_text)\n",
    "\n",
    "    if not ok:\n",
    "        ok = try_select_custom_dropdown(driver, label_text, option_text)\n",
    "\n",
    "    if not ok:\n",
    "        print(f\"    لم أستطع اختيار الفلتر: {label_text} = {option_text}\")\n",
    "        return False\n",
    "\n",
    "    click_apply_or_wait(driver)\n",
    "\n",
    "    try:\n",
    "        WebDriverWait(driver, 20).until(\n",
    "            lambda d: get_first_question(d) != old_first or option_text in d.page_source\n",
    "        )\n",
    "    except:\n",
    "        time.sleep(3)\n",
    "\n",
    "    return True\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Scrape current filtered results\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def scrape_current_results(driver, max_pages=60):\n",
    "    \"\"\"\n",
    "    يسحب نتائج الوضع الحالي للصفحة، سواء بدون فلتر أو بفلتر.\n",
    "    \"\"\"\n",
    "    rows = []\n",
    "    seen_on_filter = set()\n",
    "\n",
    "    for page_number in range(1, max_pages + 1):\n",
    "        page_rows = extract_faqs_from_html(\n",
    "            html=driver.page_source,\n",
    "            page_number=page_number,\n",
    "            current_url=driver.current_url\n",
    "        )\n",
    "\n",
    "        new_count = 0\n",
    "\n",
    "        for row in page_rows:\n",
    "            key = normalize_key(row[\"question\"], row[\"answer\"])\n",
    "            if key not in seen_on_filter:\n",
    "                seen_on_filter.add(key)\n",
    "                rows.append(row)\n",
    "                new_count += 1\n",
    "\n",
    "        print(f\"      صفحة {page_number}: المستخرج {len(page_rows)} | الجديد {new_count}\")\n",
    "\n",
    "        if page_number == max_pages:\n",
    "            break\n",
    "\n",
    "        clicked = click_next_page(driver)\n",
    "\n",
    "        if not clicked:\n",
    "            break\n",
    "\n",
    "        time.sleep(1.2)\n",
    "\n",
    "    return rows\n",
    "\n",
    "\n",
    "# ---------------------------------------------------------\n",
    "# Main Scraping\n",
    "# ---------------------------------------------------------\n",
    "\n",
    "def scrape_faq_with_filter_classification():\n",
    "    driver = setup_driver(headless=False)\n",
    "\n",
    "    try:\n",
    "        # 1) سحب كل الأسئلة بدون فلتر\n",
    "        print(\"فتح صفحة الأسئلة الشائعة...\")\n",
    "        driver.get(BASE_URL)\n",
    "        wait_page_ready(driver)\n",
    "\n",
    "        print(\"\\nاستخراج خيارات الفلاتر...\")\n",
    "        filter_options = get_filter_options(driver)\n",
    "\n",
    "        print(\"خيارات المستفيدين:\", len(filter_options[\"beneficiaries\"]))\n",
    "        print(\"خيارات القطاع:\", len(filter_options[\"sectors\"]))\n",
    "        print(\"خيارات الموقع الفرعي:\", len(filter_options[\"subsites\"]))\n",
    "\n",
    "        print(\"\\nسحب جميع الأسئلة بدون فلتر...\")\n",
    "        master_rows = scrape_current_results(driver, max_pages=TOTAL_PAGES)\n",
    "\n",
    "        master_map = {}\n",
    "\n",
    "        for row in master_rows:\n",
    "            key = normalize_key(row[\"question\"], row[\"answer\"])\n",
    "            master_map[key] = row\n",
    "            master_map[key][\"beneficiaries\"] = set()\n",
    "            master_map[key][\"sector\"] = set()\n",
    "            master_map[key][\"subsite\"] = set()\n",
    "\n",
    "        # 2) تصنيف حسب المستفيدين\n",
    "        print(\"\\nتصنيف الأسئلة حسب المستفيدين...\")\n",
    "        for option in filter_options[\"beneficiaries\"]:\n",
    "            print(f\"  فلتر المستفيدين: {option}\")\n",
    "\n",
    "            driver.get(BASE_URL)\n",
    "            wait_page_ready(driver)\n",
    "\n",
    "            if not apply_filter(driver, \"المستفيدين\", option):\n",
    "                continue\n",
    "\n",
    "            rows = scrape_current_results(driver, max_pages=TOTAL_PAGES)\n",
    "\n",
    "            for row in rows:\n",
    "                key = normalize_key(row[\"question\"], row[\"answer\"])\n",
    "\n",
    "                if key not in master_map:\n",
    "                    master_map[key] = row\n",
    "                    master_map[key][\"beneficiaries\"] = set()\n",
    "                    master_map[key][\"sector\"] = set()\n",
    "                    master_map[key][\"subsite\"] = set()\n",
    "\n",
    "                master_map[key][\"beneficiaries\"].add(option)\n",
    "\n",
    "        # 3) تصنيف حسب القطاع\n",
    "        print(\"\\nتصنيف الأسئلة حسب القطاع...\")\n",
    "        for option in filter_options[\"sectors\"]:\n",
    "            print(f\"  فلتر القطاع: {option}\")\n",
    "\n",
    "            driver.get(BASE_URL)\n",
    "            wait_page_ready(driver)\n",
    "\n",
    "            if not apply_filter(driver, \"القطاع\", option):\n",
    "                continue\n",
    "\n",
    "            rows = scrape_current_results(driver, max_pages=TOTAL_PAGES)\n",
    "\n",
    "            for row in rows:\n",
    "                key = normalize_key(row[\"question\"], row[\"answer\"])\n",
    "\n",
    "                if key not in master_map:\n",
    "                    master_map[key] = row\n",
    "                    master_map[key][\"beneficiaries\"] = set()\n",
    "                    master_map[key][\"sector\"] = set()\n",
    "                    master_map[key][\"subsite\"] = set()\n",
    "\n",
    "                master_map[key][\"sector\"].add(option)\n",
    "\n",
    "        # 4) تصنيف حسب الموقع الفرعي\n",
    "        print(\"\\nتصنيف الأسئلة حسب الموقع الفرعي...\")\n",
    "        for option in filter_options[\"subsites\"]:\n",
    "            print(f\"  فلتر الموقع الفرعي: {option}\")\n",
    "\n",
    "            driver.get(BASE_URL)\n",
    "            wait_page_ready(driver)\n",
    "\n",
    "            if not apply_filter(driver, \"الموقع الفرعي\", option):\n",
    "                continue\n",
    "\n",
    "            rows = scrape_current_results(driver, max_pages=TOTAL_PAGES)\n",
    "\n",
    "            for row in rows:\n",
    "                key = normalize_key(row[\"question\"], row[\"answer\"])\n",
    "\n",
    "                if key not in master_map:\n",
    "                    master_map[key] = row\n",
    "                    master_map[key][\"beneficiaries\"] = set()\n",
    "                    master_map[key][\"sector\"] = set()\n",
    "                    master_map[key][\"subsite\"] = set()\n",
    "\n",
    "                master_map[key][\"subsite\"].add(option)\n",
    "\n",
    "    finally:\n",
    "        driver.quit()\n",
    "\n",
    "    # تحويل الداتا النهائية إلى DataFrame\n",
    "    final_rows = []\n",
    "\n",
    "    for key, row in master_map.items():\n",
    "        beneficiaries = \" | \".join(sorted(row.get(\"beneficiaries\", set())))\n",
    "        sector = \" | \".join(sorted(row.get(\"sector\", set())))\n",
    "        subsite = \" | \".join(sorted(row.get(\"subsite\", set())))\n",
    "\n",
    "        question = row[\"question\"]\n",
    "        answer = row[\"answer\"]\n",
    "\n",
    "        final_rows.append({\n",
    "            \"question\": question,\n",
    "            \"answer\": answer,\n",
    "            \"beneficiaries\": beneficiaries,\n",
    "            \"sector\": sector,\n",
    "            \"subsite\": subsite,\n",
    "            \"page_number\": row.get(\"page_number\", \"\"),\n",
    "            \"page_url\": row.get(\"page_url\", \"\"),\n",
    "            \"source\": \"HRSD FAQ\",\n",
    "            \"searchable_text\": clean_text(\n",
    "                f\"التصنيف: {beneficiaries} {sector} {subsite} \"\n",
    "                f\"السؤال: {question} الإجابة: {answer}\"\n",
    "            )\n",
    "        })\n",
    "\n",
    "    df = pd.DataFrame(final_rows)\n",
    "\n",
    "    if df.empty:\n",
    "        return df, filter_options\n",
    "\n",
    "    df = df.drop_duplicates(subset=[\"question\", \"answer\"]).reset_index(drop=True)\n",
    "    df.insert(0, \"faq_id\", range(1, len(df) + 1))\n",
    "\n",
    "    df = df[\n",
    "        [\n",
    "            \"faq_id\",\n",
    "            \"question\",\n",
    "            \"answer\",\n",
    "            \"beneficiaries\",\n",
    "            \"sector\",\n",
    "            \"subsite\",\n",
    "            \"page_number\",\n",
    "            \"page_url\",\n",
    "            \"source\",\n",
    "            \"searchable_text\"\n",
    "        ]\n",
    "    ]\n",
    "\n",
    "    return df, filter_options\n",
    "\n",
    "\n",
    "df_faq, filter_options = scrape_faq_with_filter_classification()\n",
    "\n",
    "print(\"\\nتم الانتهاء\")\n",
    "print(\"عدد الأسئلة النهائي:\", len(df_faq))\n",
    "\n",
    "df_faq.head(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d31138f9",
   "metadata": {},
   "source": [
    "### 2.1 عدد الأسئلة المسحوبة"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a9c9b18a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "عدد الأسئلة: 711\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>faq_id</th>\n",
       "      <th>question</th>\n",
       "      <th>beneficiaries</th>\n",
       "      <th>sector</th>\n",
       "      <th>subsite</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>هل تستخدم البوابة والانظمة التابعة لها الحلول ...</td>\n",
       "      <td>أصحاب عمل | أفراد | العمالة المنزلية | كبار السن</td>\n",
       "      <td>قطاع العمل</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>ماذا يحدث بعد إرسال الطلب؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>كيف أقدم طلب تعديل فئة مهنية؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>ما متطلبات التقديم؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>من يمكنه التقديم على خدمة تعديل الفئة المهنية؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>ماذا يحدث في حال رفض الطلب؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>هل يمكن إلغاء الفاتورة؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>كيف أعرف حالة طلبي؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>ماذا يحدث بعد قبول الطلب؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>ما هي حالات الطلب؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>هل يشترط إرفاق خطاب جهة العمل؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>ما هي صيغة وحجم الملفات المسموح بها؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>هل يمكن تعديل الطلب بعد إرساله؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>هل يمكن حفظ الطلب قبل الإرسال؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>هل الخدمة (التسجيل والتصنيف المهني) فورية؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20</td>\n",
       "      <td>من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>21</td>\n",
       "      <td>ما هي خدمة التسجيل والتصنيف المهني؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>22</td>\n",
       "      <td>كم تبلغ رسوم الخدمة؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>23</td>\n",
       "      <td>ما هي المهن الاجتماعية المستهدفة بالخدمة؟</td>\n",
       "      <td>التخصصات الاجتماعية | العمالة المنزلية | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>24</td>\n",
       "      <td>هل يمكن الاستفادة من خدمات وزارة الموارد البشر...</td>\n",
       "      <td>العمالة المنزلية | كبار السن</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>25</td>\n",
       "      <td>متى ستبدأ الرقابة على منافذ الخدمة للمهنة الوا...</td>\n",
       "      <td>العمالة المنزلية | كبار السن</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>26</td>\n",
       "      <td>هل تُضْبَط مخالفة عند وجود مشرف مسكن راتبه أقل...</td>\n",
       "      <td>العمالة المنزلية | كبار السن</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>هل يطبق القرار على مسمى المهنة فقط، أو على الع...</td>\n",
       "      <td>العمالة المنزلية | كبار السن</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>هل يطبق قرار توطين المهن بالتوازي مع نطاقات؟</td>\n",
       "      <td>العمالة المنزلية | كبار السن</td>\n",
       "      <td></td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>هل يمكن تقديم طلب الخدمة دون ارفاق صك الحضانة ...</td>\n",
       "      <td>أفراد | العمالة المنزلية | ذوي الإعاقة | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>ما هو الحجم الأقصى للملف المرفق؟</td>\n",
       "      <td>أفراد | العمالة المنزلية | ذوي الإعاقة | كبار ...</td>\n",
       "      <td>قطاع التنمية الاجتماعية</td>\n",
       "      <td>مركز الرياض للسياسات السلوكية</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    faq_id                                           question  \\\n",
       "0        1  هل تستخدم البوابة والانظمة التابعة لها الحلول ...   \n",
       "1        2             ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟   \n",
       "2        3                         ماذا يحدث بعد إرسال الطلب؟   \n",
       "3        4                      كيف أقدم طلب تعديل فئة مهنية؟   \n",
       "4        5                                ما متطلبات التقديم؟   \n",
       "5        6     من يمكنه التقديم على خدمة تعديل الفئة المهنية؟   \n",
       "6        7  هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...   \n",
       "7        8  إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...   \n",
       "8        9                        ماذا يحدث في حال رفض الطلب؟   \n",
       "9       10                            هل يمكن إلغاء الفاتورة؟   \n",
       "10      11                                كيف أعرف حالة طلبي؟   \n",
       "11      12                          ماذا يحدث بعد قبول الطلب؟   \n",
       "12      13                                 ما هي حالات الطلب؟   \n",
       "13      14                     هل يشترط إرفاق خطاب جهة العمل؟   \n",
       "14      15               ما هي صيغة وحجم الملفات المسموح بها؟   \n",
       "15      16         ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟   \n",
       "16      17                    هل يمكن تعديل الطلب بعد إرساله؟   \n",
       "17      18                     هل يمكن حفظ الطلب قبل الإرسال؟   \n",
       "18      19         هل الخدمة (التسجيل والتصنيف المهني) فورية؟   \n",
       "19      20  من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...   \n",
       "20      21                ما هي خدمة التسجيل والتصنيف المهني؟   \n",
       "21      22                               كم تبلغ رسوم الخدمة؟   \n",
       "22      23          ما هي المهن الاجتماعية المستهدفة بالخدمة؟   \n",
       "23      24  هل يمكن الاستفادة من خدمات وزارة الموارد البشر...   \n",
       "24      25  متى ستبدأ الرقابة على منافذ الخدمة للمهنة الوا...   \n",
       "25      26  هل تُضْبَط مخالفة عند وجود مشرف مسكن راتبه أقل...   \n",
       "26      27  هل يطبق القرار على مسمى المهنة فقط، أو على الع...   \n",
       "27      28       هل يطبق قرار توطين المهن بالتوازي مع نطاقات؟   \n",
       "28      29  هل يمكن تقديم طلب الخدمة دون ارفاق صك الحضانة ...   \n",
       "29      30                   ما هو الحجم الأقصى للملف المرفق؟   \n",
       "\n",
       "                                        beneficiaries  \\\n",
       "0    أصحاب عمل | أفراد | العمالة المنزلية | كبار السن   \n",
       "1   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "2   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "3   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "4   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "5   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "6   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "7   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "8   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "9   التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "10  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "11  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "12  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "13  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "14  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "15  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "16  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "17  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "18  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "19  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "20  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "21  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "22  التخصصات الاجتماعية | العمالة المنزلية | كبار ...   \n",
       "23                       العمالة المنزلية | كبار السن   \n",
       "24                       العمالة المنزلية | كبار السن   \n",
       "25                       العمالة المنزلية | كبار السن   \n",
       "26                       العمالة المنزلية | كبار السن   \n",
       "27                       العمالة المنزلية | كبار السن   \n",
       "28  أفراد | العمالة المنزلية | ذوي الإعاقة | كبار ...   \n",
       "29  أفراد | العمالة المنزلية | ذوي الإعاقة | كبار ...   \n",
       "\n",
       "                     sector                        subsite  \n",
       "0                قطاع العمل  مركز الرياض للسياسات السلوكية  \n",
       "1   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "2   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "3   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "4   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "5                            مركز الرياض للسياسات السلوكية  \n",
       "6   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "7   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "8                            مركز الرياض للسياسات السلوكية  \n",
       "9   قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "10                           مركز الرياض للسياسات السلوكية  \n",
       "11  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "12  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "13  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "14  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "15  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "16  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "17  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "18  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "19  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "20  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "21  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "22  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "23                           مركز الرياض للسياسات السلوكية  \n",
       "24                           مركز الرياض للسياسات السلوكية  \n",
       "25                           مركز الرياض للسياسات السلوكية  \n",
       "26                           مركز الرياض للسياسات السلوكية  \n",
       "27                           مركز الرياض للسياسات السلوكية  \n",
       "28  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  \n",
       "29  قطاع التنمية الاجتماعية  مركز الرياض للسياسات السلوكية  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"عدد الأسئلة:\", len(df_faq))\n",
    "\n",
    "display(df_faq[[\n",
    "    \"faq_id\",\n",
    "    \"question\",\n",
    "    \"beneficiaries\",\n",
    "    \"sector\",\n",
    "    \"subsite\"\n",
    "]].head(30))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd1d616d",
   "metadata": {},
   "source": [
    "### 2.2 فحص اكتمال السحب"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d54e5642",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>page_number</th>\n",
       "      <th>questions_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>21</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>22</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>23</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>24</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>25</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>26</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>31</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>32</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>33</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>34</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>35</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>36</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>37</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>38</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>39</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>40</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>41</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>42</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>43</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>44</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>45</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>46</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>47</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>48</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>49</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>50</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>51</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>52</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>53</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>54</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>55</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>56</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>57</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>58</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>59</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>60</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    page_number  questions_count\n",
       "0             1               12\n",
       "1             2               11\n",
       "2             3               12\n",
       "3             4               12\n",
       "4             5               12\n",
       "5             6               12\n",
       "6             7               12\n",
       "7             8               12\n",
       "8             9               12\n",
       "9            10               12\n",
       "10           11               12\n",
       "11           12               12\n",
       "12           13               12\n",
       "13           14               12\n",
       "14           15               12\n",
       "15           16               12\n",
       "16           17               10\n",
       "17           18               12\n",
       "18           19               12\n",
       "19           20               12\n",
       "20           21               12\n",
       "21           22               12\n",
       "22           23               12\n",
       "23           24               12\n",
       "24           25               12\n",
       "25           26               12\n",
       "26           27               12\n",
       "27           28               12\n",
       "28           29               12\n",
       "29           30               12\n",
       "30           31               12\n",
       "31           32               12\n",
       "32           33               12\n",
       "33           34               12\n",
       "34           35               12\n",
       "35           36               12\n",
       "36           37               12\n",
       "37           38               11\n",
       "38           39               12\n",
       "39           40               12\n",
       "40           41               12\n",
       "41           42               12\n",
       "42           43               12\n",
       "43           44               12\n",
       "44           45               12\n",
       "45           46               12\n",
       "46           47               12\n",
       "47           48               12\n",
       "48           49               12\n",
       "49           50               12\n",
       "50           51               12\n",
       "51           52               12\n",
       "52           53               12\n",
       "53           54               12\n",
       "54           55               12\n",
       "55           56               12\n",
       "56           57               12\n",
       "57           58               11\n",
       "58           59               11\n",
       "59           60                9"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "عدد الصفحات المسحوبة: 60\n",
      "إجمالي الأسئلة: 711\n",
      "أقل عدد أسئلة في صفحة: 9\n",
      "أعلى عدد أسئلة في صفحة: 12\n",
      "\n",
      "صفحات تحتاج مراجعة فعلية:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>page_number</th>\n",
       "      <th>questions_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [page_number, questions_count]\n",
       "Index: []"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "لا توجد صفحات ناقصة بشكل غير طبيعي. الصفحة الأخيرة قد تحتوي على عدد أقل وهذا طبيعي.\n"
     ]
    }
   ],
   "source": [
    "# ============================================================\n",
    "# فحص اكتمال سحب صفحات FAQ\n",
    "# مع استثناء الصفحة الأخيرة لأنها قد تحتوي على عدد أقل طبيعيًا\n",
    "# ============================================================\n",
    "\n",
    "faq_page_check = (\n",
    "    df_faq.groupby(\"page_number\")[\"question\"]\n",
    "    .count()\n",
    "    .reset_index(name=\"questions_count\")\n",
    ")\n",
    "\n",
    "display(faq_page_check)\n",
    "\n",
    "total_pages = faq_page_check[\"page_number\"].nunique()\n",
    "last_page = faq_page_check[\"page_number\"].max()\n",
    "\n",
    "print(\"عدد الصفحات المسحوبة:\", total_pages)\n",
    "print(\"إجمالي الأسئلة:\", faq_page_check[\"questions_count\"].sum())\n",
    "print(\"أقل عدد أسئلة في صفحة:\", faq_page_check[\"questions_count\"].min())\n",
    "print(\"أعلى عدد أسئلة في صفحة:\", faq_page_check[\"questions_count\"].max())\n",
    "\n",
    "# نراجع فقط الصفحات غير الأخيرة إذا كان عدد الأسئلة فيها قليل جداً\n",
    "pages_need_review = faq_page_check[\n",
    "    (faq_page_check[\"page_number\"] != last_page) &\n",
    "    (faq_page_check[\"questions_count\"] < 10)\n",
    "]\n",
    "\n",
    "print(\"\\nصفحات تحتاج مراجعة فعلية:\")\n",
    "display(pages_need_review)\n",
    "\n",
    "if pages_need_review.empty:\n",
    "    print(\"لا توجد صفحات ناقصة بشكل غير طبيعي. الصفحة الأخيرة قد تحتوي على عدد أقل وهذا طبيعي.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3cda166b",
   "metadata": {},
   "source": [
    "### 2.3 معاينة الأسئلة"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "df12d7b6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>faq_id</th>\n",
       "      <th>question</th>\n",
       "      <th>answer</th>\n",
       "      <th>page_number</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>هل تستخدم البوابة والانظمة التابعة لها الحلول ...</td>\n",
       "      <td>تقدم الوزارة خدمة التوقيع الالكتروني في اطار ا...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟</td>\n",
       "      <td>الدخول إلى “مهامي” ← اختيار مهمة طلب مراجعة ← ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>ماذا يحدث بعد إرسال الطلب؟</td>\n",
       "      <td>يتم تحويل الطلب إلى اللجنة للمراجعة ويتم إشعار...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>كيف أقدم طلب تعديل فئة مهنية؟</td>\n",
       "      <td>من خلال تسجيل الدخول ← الخدمات ← اختيار “طلب ت...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>ما متطلبات التقديم؟</td>\n",
       "      <td>أن يكون المتقدم حاصل على ترخيص سابق.</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>من يمكنه التقديم على خدمة تعديل الفئة المهنية؟</td>\n",
       "      <td>الممارس الحاصل على ترخيص من خلال خدمة التسجيل ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...</td>\n",
       "      <td>نعم، يمكن للمتقدم الحصول على أكثر من رخصة إذا ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...</td>\n",
       "      <td>نعم، يحق لك استرداد رسوم خدمة التسجيل والتصنيف...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>ماذا يحدث في حال رفض الطلب؟</td>\n",
       "      <td>يمكنك الاطلاع على سبب الرفض من خلال تفاصيل الط...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>هل يمكن إلغاء الفاتورة؟</td>\n",
       "      <td>نعم، يمكن إلغاء الفاتورة قبل السداد، مع ضرورة ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>كيف أعرف حالة طلبي؟</td>\n",
       "      <td>يمكنك متابعة حالة الطلب من خلال صفحة “طلباتي” ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>12</td>\n",
       "      <td>ماذا يحدث بعد قبول الطلب؟</td>\n",
       "      <td>قد يتم: قبول مباشر وإصدار الرخصة قبول مباشر وإ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>13</td>\n",
       "      <td>ما هي حالات الطلب؟</td>\n",
       "      <td>تحت الإجراء تحت الإجراء مرفوض مرفوض مكتمل مكتمل</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>14</td>\n",
       "      <td>هل يشترط إرفاق خطاب جهة العمل؟</td>\n",
       "      <td>نعم، يجب إرفاق خطاب جهة العمل لكل خبرة عملية م...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>15</td>\n",
       "      <td>ما هي صيغة وحجم الملفات المسموح بها؟</td>\n",
       "      <td>الصيغ المقبولة: PDF – JPEG – PNG الصيغ المقبول...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>16</td>\n",
       "      <td>ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟</td>\n",
       "      <td>يمكنك إدخال البيانات يدويًا وإرفاق المستندات ا...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>هل يمكن تعديل الطلب بعد إرساله؟</td>\n",
       "      <td>لا يمكن تعديل الطلب بعد الإرسال، إلا في حال تم...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>هل يمكن حفظ الطلب قبل الإرسال؟</td>\n",
       "      <td>نعم، يمكن حفظ الطلب كـ مسودة واستكماله لاحقًا.</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>هل الخدمة (التسجيل والتصنيف المهني) فورية؟</td>\n",
       "      <td>تقديم الطلب فوري، أما الطلب فيخضع للمراجعة.</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>20</td>\n",
       "      <td>من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...</td>\n",
       "      <td>يمكن لأي ممارس حاصل على مؤهل علمي أو دورة تدري...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>21</td>\n",
       "      <td>ما هي خدمة التسجيل والتصنيف المهني؟</td>\n",
       "      <td>هي خدمة تتيح للممارس الاجتماعي التقديم إلكترون...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>22</td>\n",
       "      <td>كم تبلغ رسوم الخدمة؟</td>\n",
       "      <td>رسوم خدمة التسجيل والتصنيف 450 ريال رسوم خدمة ...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>23</td>\n",
       "      <td>ما هي المهن الاجتماعية المستهدفة بالخدمة؟</td>\n",
       "      <td>المهن الاجتماعية المستهدفة بالخدمة حاليا هي: أ...</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>24</td>\n",
       "      <td>هل يمكن الاستفادة من خدمات وزارة الموارد البشر...</td>\n",
       "      <td>نعم، يمكن الاستفادة من خدمات الوزارة (خلال فتر...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>25</td>\n",
       "      <td>متى ستبدأ الرقابة على منافذ الخدمة للمهنة الوا...</td>\n",
       "      <td>في التاريخ المحدد لتطبيق وتنفيذ القرار.</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>26</td>\n",
       "      <td>هل تُضْبَط مخالفة عند وجود مشرف مسكن راتبه أقل...</td>\n",
       "      <td>نعم يَخالفون.</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>27</td>\n",
       "      <td>هل يطبق القرار على مسمى المهنة فقط، أو على الع...</td>\n",
       "      <td>يتم تطبيق القرار على المسميات المهنية والعمل ا...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>28</td>\n",
       "      <td>هل يطبق قرار توطين المهن بالتوازي مع نطاقات؟</td>\n",
       "      <td>نعم، يُطبق قرار توطين المهن على المهن المستهدف...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>29</td>\n",
       "      <td>هل يمكن تقديم طلب الخدمة دون ارفاق صك الحضانة ...</td>\n",
       "      <td>لا يمكن الاستفادة من الخدمة دون ارفاق الصك او ...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>ما هو الحجم الأقصى للملف المرفق؟</td>\n",
       "      <td>الا يتجاوز 2 ميقا</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>31</td>\n",
       "      <td>كيف يمكن متابعة حالة الطلب؟</td>\n",
       "      <td>عن طريق منصة الرعاية من ايقونة طلباتي</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>32</td>\n",
       "      <td>ماهي الفئات العمرية التي يمكن الاستفادة من الخ...</td>\n",
       "      <td>من هم اقل من 18 عام ويستثنى من ذلك من يعاني من...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>33</td>\n",
       "      <td>هل تقبل الوكالة الشرعية كمستند للخدمة؟</td>\n",
       "      <td>لا تقبل الوكالة بل يتطلب صك حضانة او وثيقة صلح...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>34</td>\n",
       "      <td>ماهي مبادرة \"عقد العمل الموثق سندًا تنفيذيًا\"؟</td>\n",
       "      <td>المبادرة بالشراكة مع وزارة العدل انطلاقًا من ر...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>35</td>\n",
       "      <td>هل يحق صاحب العمل في الاعتراض في عقد العمل الم...</td>\n",
       "      <td>يحق لصاحب العمل الاعتراض على طلب التنفيذ عن طر...</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>36</td>\n",
       "      <td>كيف يتم التحقق من استلام العامل للأجر الذي سيت...</td>\n",
       "      <td>يتم التحقق إلكترونيا وفق بيانات برنامج حماية ا...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>37</td>\n",
       "      <td>كيف يتم رفع طلب التنفيذ في حال عدم التزام صاحب...</td>\n",
       "      <td>يتم وفق التالي: الدخول على منصة ناجز التابعة ل...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>38</td>\n",
       "      <td>متى يمكن للعامل التنفيذ على صاحب العمل في حال ...</td>\n",
       "      <td>في حال عدم السداد لكامل الاجر سيُمكن العامل من...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>39</td>\n",
       "      <td>ماهو بند العقد الخاضع للتنفيذ لعقد العمل الموث...</td>\n",
       "      <td>البند الخاضع للتنفيذ هو بند الأجر ويشمل ما يلي...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>40</td>\n",
       "      <td>كيفية توثيق عقد العمل على نموذج عقد العمل الجد...</td>\n",
       "      <td>يتم التوثيق عبر منصة ( قوى ) حيث تتقدم المنشأة...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>41</td>\n",
       "      <td>ماهي مراحل التطبيق على العقود الموثقة لعقد الع...</td>\n",
       "      <td>سيتم تطبيق نموذج عقد العمل الموحد الجديد (سند ...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>42</td>\n",
       "      <td>ماهي متطلبات الاستفادة من مبادرة عقد العمل الم...</td>\n",
       "      <td>وجود عقد عمل موثق بمنصة (قوى) وفق نموذج عقد ال...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>43</td>\n",
       "      <td>كيف يمكن الاستفادة من الخدمة؟</td>\n",
       "      <td>بواسطة قناة تقديم الخدمة من خلال الضغط على زر ...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>44</td>\n",
       "      <td>هل أحتاج إلى طباعة الموعد؟</td>\n",
       "      <td>لا يتطلب ذلك, حيث يمكن التحقق من الموعد من خلا...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>45</td>\n",
       "      <td>هل أستطيع إلغاء الموعد؟</td>\n",
       "      <td>نعم, يكن للمستفيد إلغاء الموعد</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>46</td>\n",
       "      <td>كم عدد المواعيد التي يمكنني حجزها؟</td>\n",
       "      <td>يمكن للمستفيد حجز موعد واحد فقط</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>47</td>\n",
       "      <td>ما هي قنوات الخدمة لبطاقة امتياز لكبار السن؟</td>\n",
       "      <td>تقدم الخدمة عن طريق تطبيق وزارة الموارد البشري...</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>48</td>\n",
       "      <td>شروط الحصول على بطاقة امتياز لكبار السن؟</td>\n",
       "      <td>أن يكون سعودي الجنسية. أن يكون سعودي الجنسية. ...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48</th>\n",
       "      <td>49</td>\n",
       "      <td>تعرّف على خدمة \"قناة لغة الإشارة\" التي يقدمها ...</td>\n",
       "      <td>\" قناة لغة الإشارة \" على موقع الوزارة الإلكترو...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>50</td>\n",
       "      <td>كيف أعرف المقاس المناسب لي عند اختياري الكرسي ...</td>\n",
       "      <td>المقاس المناسب لي عند اختياري الكرسي المتحرك</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>51</td>\n",
       "      <td>الاعاقات خدماتها ومعاييرها الطبية كالتالي:</td>\n",
       "      <td>اسم الإعاقة الموحدة المعايير الطبية الخدمات ال...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>52</td>\n",
       "      <td>كيف يمكن متابعة الطلب بعد التقديم على خدمة الم...</td>\n",
       "      <td>الخدمة فورية لذلك الطلب لا يحتاج إلى متابعة بع...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>53</td>\n",
       "      <td>ماهي الجامعات او الكليات التي تقدم خدمة مكافأة...</td>\n",
       "      <td>كافة الجامعات والكليات الحكومية.</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>54</td>\n",
       "      <td>ماهي الإعاقات التي تستحق خدمة المكافأة المالية...</td>\n",
       "      <td>الاعاقات المستحقة لخدمة المكافأة المالية للطلب...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>55</td>\n",
       "      <td>ما هي خدمة المكافأة المالية للطلبة الجامعيين م...</td>\n",
       "      <td>تمكن خدمة الأشخاص ذوي الإعاقة من طلاب وطالبات ...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>56</td>\n",
       "      <td>ماهي الطرق البديلة للحصول على المعلومات؟</td>\n",
       "      <td>تعزيزاً لمبدأ الشفافية وحق الوصول إلى المعلوما...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>57</td>\n",
       "      <td>ما هي المعلومات المستثناة من الطلبات؟</td>\n",
       "      <td>أي معلومات مصنفة على انها مقيدة أو سرية أو سري...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>58</td>\n",
       "      <td>ما هي المعلومات التي يمكن طلبها؟</td>\n",
       "      <td>جميع المعلومات غير المحمية والتي ينتجها وزارة ...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>58</th>\n",
       "      <td>59</td>\n",
       "      <td>ما هي الخطوات الرئيسية لطلب الاطلاع أو الحصول ...</td>\n",
       "      <td>أولاً: يتم تقديم الطلبات عن طريق ملء \" نموذج ط...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>60</td>\n",
       "      <td>ما هي المتطلبات الرئيسية لطلبات الوصول إلى الم...</td>\n",
       "      <td>يجب أن يكون الطلب إلكترونيا. يجب أن يكون الطلب...</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    faq_id                                           question  \\\n",
       "0        1  هل تستخدم البوابة والانظمة التابعة لها الحلول ...   \n",
       "1        2             ماذا أفعل إذا تم إرجاع الطلب للمراجعة؟   \n",
       "2        3                         ماذا يحدث بعد إرسال الطلب؟   \n",
       "3        4                      كيف أقدم طلب تعديل فئة مهنية؟   \n",
       "4        5                                ما متطلبات التقديم؟   \n",
       "5        6     من يمكنه التقديم على خدمة تعديل الفئة المهنية؟   \n",
       "6        7  هل يمكن للمتقدم أن يحصل على أكثر من تصنيف وبال...   \n",
       "7        8  إذا رفض طلب التسجيل والتصنيف هل يحق لي استرداد...   \n",
       "8        9                        ماذا يحدث في حال رفض الطلب؟   \n",
       "9       10                            هل يمكن إلغاء الفاتورة؟   \n",
       "10      11                                كيف أعرف حالة طلبي؟   \n",
       "11      12                          ماذا يحدث بعد قبول الطلب؟   \n",
       "12      13                                 ما هي حالات الطلب؟   \n",
       "13      14                     هل يشترط إرفاق خطاب جهة العمل؟   \n",
       "14      15               ما هي صيغة وحجم الملفات المسموح بها؟   \n",
       "15      16         ماذا أفعل إذا لم يتم جلب بياناتي تلقائيًا؟   \n",
       "16      17                    هل يمكن تعديل الطلب بعد إرساله؟   \n",
       "17      18                     هل يمكن حفظ الطلب قبل الإرسال؟   \n",
       "18      19         هل الخدمة (التسجيل والتصنيف المهني) فورية؟   \n",
       "19      20  من يمكنه التقديم على الخدمة (التسجيل والتصنيف ...   \n",
       "20      21                ما هي خدمة التسجيل والتصنيف المهني؟   \n",
       "21      22                               كم تبلغ رسوم الخدمة؟   \n",
       "22      23          ما هي المهن الاجتماعية المستهدفة بالخدمة؟   \n",
       "23      24  هل يمكن الاستفادة من خدمات وزارة الموارد البشر...   \n",
       "24      25  متى ستبدأ الرقابة على منافذ الخدمة للمهنة الوا...   \n",
       "25      26  هل تُضْبَط مخالفة عند وجود مشرف مسكن راتبه أقل...   \n",
       "26      27  هل يطبق القرار على مسمى المهنة فقط، أو على الع...   \n",
       "27      28       هل يطبق قرار توطين المهن بالتوازي مع نطاقات؟   \n",
       "28      29  هل يمكن تقديم طلب الخدمة دون ارفاق صك الحضانة ...   \n",
       "29      30                   ما هو الحجم الأقصى للملف المرفق؟   \n",
       "30      31                        كيف يمكن متابعة حالة الطلب؟   \n",
       "31      32  ماهي الفئات العمرية التي يمكن الاستفادة من الخ...   \n",
       "32      33             هل تقبل الوكالة الشرعية كمستند للخدمة؟   \n",
       "33      34     ماهي مبادرة \"عقد العمل الموثق سندًا تنفيذيًا\"؟   \n",
       "34      35  هل يحق صاحب العمل في الاعتراض في عقد العمل الم...   \n",
       "35      36  كيف يتم التحقق من استلام العامل للأجر الذي سيت...   \n",
       "36      37  كيف يتم رفع طلب التنفيذ في حال عدم التزام صاحب...   \n",
       "37      38  متى يمكن للعامل التنفيذ على صاحب العمل في حال ...   \n",
       "38      39  ماهو بند العقد الخاضع للتنفيذ لعقد العمل الموث...   \n",
       "39      40  كيفية توثيق عقد العمل على نموذج عقد العمل الجد...   \n",
       "40      41  ماهي مراحل التطبيق على العقود الموثقة لعقد الع...   \n",
       "41      42  ماهي متطلبات الاستفادة من مبادرة عقد العمل الم...   \n",
       "42      43                      كيف يمكن الاستفادة من الخدمة؟   \n",
       "43      44                         هل أحتاج إلى طباعة الموعد؟   \n",
       "44      45                            هل أستطيع إلغاء الموعد؟   \n",
       "45      46                 كم عدد المواعيد التي يمكنني حجزها؟   \n",
       "46      47       ما هي قنوات الخدمة لبطاقة امتياز لكبار السن؟   \n",
       "47      48           شروط الحصول على بطاقة امتياز لكبار السن؟   \n",
       "48      49  تعرّف على خدمة \"قناة لغة الإشارة\" التي يقدمها ...   \n",
       "49      50  كيف أعرف المقاس المناسب لي عند اختياري الكرسي ...   \n",
       "50      51         الاعاقات خدماتها ومعاييرها الطبية كالتالي:   \n",
       "51      52  كيف يمكن متابعة الطلب بعد التقديم على خدمة الم...   \n",
       "52      53  ماهي الجامعات او الكليات التي تقدم خدمة مكافأة...   \n",
       "53      54  ماهي الإعاقات التي تستحق خدمة المكافأة المالية...   \n",
       "54      55  ما هي خدمة المكافأة المالية للطلبة الجامعيين م...   \n",
       "55      56           ماهي الطرق البديلة للحصول على المعلومات؟   \n",
       "56      57              ما هي المعلومات المستثناة من الطلبات؟   \n",
       "57      58                   ما هي المعلومات التي يمكن طلبها؟   \n",
       "58      59  ما هي الخطوات الرئيسية لطلب الاطلاع أو الحصول ...   \n",
       "59      60  ما هي المتطلبات الرئيسية لطلبات الوصول إلى الم...   \n",
       "\n",
       "                                               answer  page_number  \n",
       "0   تقدم الوزارة خدمة التوقيع الالكتروني في اطار ا...            1  \n",
       "1   الدخول إلى “مهامي” ← اختيار مهمة طلب مراجعة ← ...            1  \n",
       "2   يتم تحويل الطلب إلى اللجنة للمراجعة ويتم إشعار...            1  \n",
       "3   من خلال تسجيل الدخول ← الخدمات ← اختيار “طلب ت...            1  \n",
       "4                أن يكون المتقدم حاصل على ترخيص سابق.            1  \n",
       "5   الممارس الحاصل على ترخيص من خلال خدمة التسجيل ...            1  \n",
       "6   نعم، يمكن للمتقدم الحصول على أكثر من رخصة إذا ...            1  \n",
       "7   نعم، يحق لك استرداد رسوم خدمة التسجيل والتصنيف...            1  \n",
       "8   يمكنك الاطلاع على سبب الرفض من خلال تفاصيل الط...            1  \n",
       "9   نعم، يمكن إلغاء الفاتورة قبل السداد، مع ضرورة ...            1  \n",
       "10  يمكنك متابعة حالة الطلب من خلال صفحة “طلباتي” ...            1  \n",
       "11  قد يتم: قبول مباشر وإصدار الرخصة قبول مباشر وإ...            1  \n",
       "12    تحت الإجراء تحت الإجراء مرفوض مرفوض مكتمل مكتمل            2  \n",
       "13  نعم، يجب إرفاق خطاب جهة العمل لكل خبرة عملية م...            2  \n",
       "14  الصيغ المقبولة: PDF – JPEG – PNG الصيغ المقبول...            2  \n",
       "15  يمكنك إدخال البيانات يدويًا وإرفاق المستندات ا...            2  \n",
       "16  لا يمكن تعديل الطلب بعد الإرسال، إلا في حال تم...            2  \n",
       "17     نعم، يمكن حفظ الطلب كـ مسودة واستكماله لاحقًا.            2  \n",
       "18        تقديم الطلب فوري، أما الطلب فيخضع للمراجعة.            2  \n",
       "19  يمكن لأي ممارس حاصل على مؤهل علمي أو دورة تدري...            2  \n",
       "20  هي خدمة تتيح للممارس الاجتماعي التقديم إلكترون...            2  \n",
       "21  رسوم خدمة التسجيل والتصنيف 450 ريال رسوم خدمة ...            2  \n",
       "22  المهن الاجتماعية المستهدفة بالخدمة حاليا هي: أ...            2  \n",
       "23  نعم، يمكن الاستفادة من خدمات الوزارة (خلال فتر...            3  \n",
       "24            في التاريخ المحدد لتطبيق وتنفيذ القرار.            3  \n",
       "25                                      نعم يَخالفون.            3  \n",
       "26  يتم تطبيق القرار على المسميات المهنية والعمل ا...            3  \n",
       "27  نعم، يُطبق قرار توطين المهن على المهن المستهدف...            3  \n",
       "28  لا يمكن الاستفادة من الخدمة دون ارفاق الصك او ...            3  \n",
       "29                                  الا يتجاوز 2 ميقا            3  \n",
       "30              عن طريق منصة الرعاية من ايقونة طلباتي            3  \n",
       "31  من هم اقل من 18 عام ويستثنى من ذلك من يعاني من...            3  \n",
       "32  لا تقبل الوكالة بل يتطلب صك حضانة او وثيقة صلح...            3  \n",
       "33  المبادرة بالشراكة مع وزارة العدل انطلاقًا من ر...            3  \n",
       "34  يحق لصاحب العمل الاعتراض على طلب التنفيذ عن طر...            3  \n",
       "35  يتم التحقق إلكترونيا وفق بيانات برنامج حماية ا...            4  \n",
       "36  يتم وفق التالي: الدخول على منصة ناجز التابعة ل...            4  \n",
       "37  في حال عدم السداد لكامل الاجر سيُمكن العامل من...            4  \n",
       "38  البند الخاضع للتنفيذ هو بند الأجر ويشمل ما يلي...            4  \n",
       "39  يتم التوثيق عبر منصة ( قوى ) حيث تتقدم المنشأة...            4  \n",
       "40  سيتم تطبيق نموذج عقد العمل الموحد الجديد (سند ...            4  \n",
       "41  وجود عقد عمل موثق بمنصة (قوى) وفق نموذج عقد ال...            4  \n",
       "42  بواسطة قناة تقديم الخدمة من خلال الضغط على زر ...            4  \n",
       "43  لا يتطلب ذلك, حيث يمكن التحقق من الموعد من خلا...            4  \n",
       "44                     نعم, يكن للمستفيد إلغاء الموعد            4  \n",
       "45                    يمكن للمستفيد حجز موعد واحد فقط            4  \n",
       "46  تقدم الخدمة عن طريق تطبيق وزارة الموارد البشري...            4  \n",
       "47  أن يكون سعودي الجنسية. أن يكون سعودي الجنسية. ...            5  \n",
       "48  \" قناة لغة الإشارة \" على موقع الوزارة الإلكترو...            5  \n",
       "49       المقاس المناسب لي عند اختياري الكرسي المتحرك            5  \n",
       "50  اسم الإعاقة الموحدة المعايير الطبية الخدمات ال...            5  \n",
       "51  الخدمة فورية لذلك الطلب لا يحتاج إلى متابعة بع...            5  \n",
       "52                   كافة الجامعات والكليات الحكومية.            5  \n",
       "53  الاعاقات المستحقة لخدمة المكافأة المالية للطلب...            5  \n",
       "54  تمكن خدمة الأشخاص ذوي الإعاقة من طلاب وطالبات ...            5  \n",
       "55  تعزيزاً لمبدأ الشفافية وحق الوصول إلى المعلوما...            5  \n",
       "56  أي معلومات مصنفة على انها مقيدة أو سرية أو سري...            5  \n",
       "57  جميع المعلومات غير المحمية والتي ينتجها وزارة ...            5  \n",
       "58  أولاً: يتم تقديم الطلبات عن طريق ملء \" نموذج ط...            5  \n",
       "59  يجب أن يكون الطلب إلكترونيا. يجب أن يكون الطلب...            6  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_faq[[\"faq_id\", \"question\", \"answer\", \"page_number\"]].head(60)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c84c974",
   "metadata": {},
   "source": [
    "### 2.4 فحص اكتمال أعمدة الأسئلة"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5b880d94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "faq_id             711\n",
       "question           711\n",
       "answer             711\n",
       "beneficiaries      711\n",
       "sector             711\n",
       "subsite            711\n",
       "page_number        711\n",
       "page_url           711\n",
       "source             711\n",
       "searchable_text    711\n",
       "dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_faq.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "341df057",
   "metadata": {},
   "source": [
    "## المرحلة 3: الحفظ النهائي الموحد\n",
    "\n",
    "هذه الخلية تحفظ مخرجات السحب النظيفة في مكانين:\n",
    "\n",
    "1. نفس مجلد النوتبوك، لسهولة الفحص المباشر.\n",
    "2. مجلد المشروع `saudi_labor_law_voice_agent_project/01_raw/`، وهو المسار الذي ستقرأ منه نوتبوكات المعالجة وRAG لاحقاً.\n",
    "\n",
    "بهذا لا تحتاج لإعادة السحب في كل نوتبوك.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "2627ecfd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "تم حفظ مخرجات السحب النهائية بنجاح.\n",
      "\n",
      "مجلد المشروع:\n",
      "C:\\Users\\PC\\Desktop\\data collection code\\saudi_labor_law_voice_agent_project\\01_raw\n",
      "\n",
      "فحص مواد نظام العمل:\n",
      "عدد الصفوف: 249\n",
      "عدد المواد: 245 | الأعلى: 245\n",
      "المفقود من 1 إلى 245: []\n",
      "عدد التكرارات الحقيقية: 0\n",
      "عدد المواد بدون نص: 0\n",
      "\n",
      "توزيع حالة المواد:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>article_status</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>active</th>\n",
       "      <td>211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>repealed</th>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                count\n",
       "article_status       \n",
       "active            211\n",
       "repealed           38"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "فحص FAQ:\n",
      "عدد الأسئلة: 711\n",
      "عدد التكرارات: 0\n",
      "أسئلة بدون جواب: 0\n",
      "\n",
      "الملفات الأساسية التي ستستخدمها بقية النوتبوكات:\n",
      "C:\\Users\\PC\\Desktop\\data collection code\\saudi_labor_law_voice_agent_project\\01_raw\\saudi_labor_law_by_bab_articles.csv\n",
      "C:\\Users\\PC\\Desktop\\data collection code\\saudi_labor_law_voice_agent_project\\01_raw\\hrsd_faq_with_filters_classification.csv\n"
     ]
    }
   ],
   "source": [
    "# ============================================================\n",
    "# Unified Final Save Cell\n",
    "# حفظ مخرجات السحب النهائية لاستخدامها في بقية النوتبوكات بدون إعادة Scraping\n",
    "# ============================================================\n",
    "\n",
    "from pathlib import Path\n",
    "import json\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 1) مجلد المشروع المعتمد لبقية النوتبوكات\n",
    "# ------------------------------------------------------------\n",
    "PROJECT_DIR = Path.cwd() / \"saudi_labor_law_voice_agent_project\"\n",
    "RAW_DIR = PROJECT_DIR / \"01_raw\"\n",
    "\n",
    "PROJECT_DIR.mkdir(exist_ok=True)\n",
    "RAW_DIR.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 2) تجهيز نسخة FAQ نظيفة قبل الحفظ\n",
    "# ------------------------------------------------------------\n",
    "df_faq_clean = df_faq.copy()\n",
    "\n",
    "for col in [\"question\", \"answer\", \"beneficiaries\", \"sector\", \"subsite\", \"page_url\", \"source\", \"searchable_text\"]:\n",
    "    if col in df_faq_clean.columns:\n",
    "        df_faq_clean[col] = (\n",
    "            df_faq_clean[col]\n",
    "            .fillna(\"\")\n",
    "            .astype(str)\n",
    "            .str.replace(r\"\\s+\", \" \", regex=True)\n",
    "            .str.strip()\n",
    "        )\n",
    "\n",
    "if {\"question\", \"answer\"}.issubset(df_faq_clean.columns):\n",
    "    df_faq_clean = (\n",
    "        df_faq_clean\n",
    "        .drop_duplicates(subset=[\"question\", \"answer\"], keep=\"first\")\n",
    "        .reset_index(drop=True)\n",
    "    )\n",
    "\n",
    "    # إعادة ترقيم faq_id بعد إزالة التكرار\n",
    "    if \"faq_id\" in df_faq_clean.columns:\n",
    "        df_faq_clean = df_faq_clean.drop(columns=[\"faq_id\"])\n",
    "    df_faq_clean.insert(0, \"faq_id\", range(1, len(df_faq_clean) + 1))\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 3) أسماء الملفات المعتمدة\n",
    "# ------------------------------------------------------------\n",
    "LAW_OUTPUT_CSV = \"saudi_labor_law_by_bab_articles.csv\"\n",
    "LAW_OUTPUT_XLSX = \"saudi_labor_law_by_bab_articles.xlsx\"\n",
    "LAW_OUTPUT_JSON = \"saudi_labor_law_by_bab_articles.json\"\n",
    "\n",
    "FAQ_OUTPUT_CSV = \"hrsd_faq_with_filters_classification.csv\"\n",
    "FAQ_OUTPUT_XLSX = \"hrsd_faq_with_filters_classification.xlsx\"\n",
    "FAQ_OUTPUT_JSON = \"hrsd_faq_with_filters_classification.json\"\n",
    "\n",
    "# مسارات مجلد المشروع\n",
    "LAW_PROJECT_CSV = RAW_DIR / LAW_OUTPUT_CSV\n",
    "LAW_PROJECT_XLSX = RAW_DIR / LAW_OUTPUT_XLSX\n",
    "LAW_PROJECT_JSON = RAW_DIR / LAW_OUTPUT_JSON\n",
    "\n",
    "FAQ_PROJECT_CSV = RAW_DIR / FAQ_OUTPUT_CSV\n",
    "FAQ_PROJECT_XLSX = RAW_DIR / FAQ_OUTPUT_XLSX\n",
    "FAQ_PROJECT_JSON = RAW_DIR / FAQ_OUTPUT_JSON\n",
    "\n",
    "# أسماء إضافية واضحة للنسخ النظيفة داخل 01_raw\n",
    "LAW_CLEAN_CSV = RAW_DIR / \"saudi_labor_law_articles_clean.csv\"\n",
    "FAQ_CLEAN_CSV = RAW_DIR / \"hrsd_faq_clean.csv\"\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 4) حفظ مواد نظام العمل\n",
    "# ------------------------------------------------------------\n",
    "df_labor_law_clean.to_csv(LAW_OUTPUT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "df_labor_law_clean.to_excel(LAW_OUTPUT_XLSX, index=False)\n",
    "\n",
    "with open(LAW_OUTPUT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "    json.dump(df_labor_law_clean.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "# نسخة داخل مجلد المشروع\n",
    "df_labor_law_clean.to_csv(LAW_PROJECT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "df_labor_law_clean.to_excel(LAW_PROJECT_XLSX, index=False)\n",
    "\n",
    "with open(LAW_PROJECT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "    json.dump(df_labor_law_clean.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "df_labor_law_clean.to_csv(LAW_CLEAN_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 5) حفظ FAQ\n",
    "# ------------------------------------------------------------\n",
    "df_faq_clean.to_csv(FAQ_OUTPUT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "df_faq_clean.to_excel(FAQ_OUTPUT_XLSX, index=False)\n",
    "\n",
    "with open(FAQ_OUTPUT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "    json.dump(df_faq_clean.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "# نسخة داخل مجلد المشروع\n",
    "df_faq_clean.to_csv(FAQ_PROJECT_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "df_faq_clean.to_excel(FAQ_PROJECT_XLSX, index=False)\n",
    "\n",
    "with open(FAQ_PROJECT_JSON, \"w\", encoding=\"utf-8\") as f:\n",
    "    json.dump(df_faq_clean.to_dict(orient=\"records\"), f, ensure_ascii=False, indent=2)\n",
    "\n",
    "df_faq_clean.to_csv(FAQ_CLEAN_CSV, index=False, encoding=\"utf-8-sig\")\n",
    "\n",
    "# ------------------------------------------------------------\n",
    "# 6) فحص نهائي سريع\n",
    "# ------------------------------------------------------------\n",
    "nums = set(df_labor_law_clean[\"article_number_int\"].dropna().astype(int))\n",
    "\n",
    "print(\"تم حفظ مخرجات السحب النهائية بنجاح.\")\n",
    "print(\"\\nمجلد المشروع:\")\n",
    "print(RAW_DIR)\n",
    "\n",
    "print(\"\\nفحص مواد نظام العمل:\")\n",
    "print(\"عدد الصفوف:\", len(df_labor_law_clean))\n",
    "print(\"عدد المواد:\", len(nums), \"| الأعلى:\", max(nums) if nums else None)\n",
    "print(\"المفقود من 1 إلى 245:\", [n for n in range(1, 246) if n not in nums])\n",
    "print(\"عدد التكرارات الحقيقية:\", df_labor_law_clean[\"article_number_label\"].duplicated().sum())\n",
    "print(\"عدد المواد بدون نص:\", (df_labor_law_clean[\"article_text\"].astype(str).str.strip() == \"\").sum())\n",
    "\n",
    "print(\"\\nتوزيع حالة المواد:\")\n",
    "display(df_labor_law_clean[\"article_status\"].value_counts().to_frame(\"count\"))\n",
    "\n",
    "print(\"\\nفحص FAQ:\")\n",
    "print(\"عدد الأسئلة:\", len(df_faq_clean))\n",
    "if {\"question\", \"answer\"}.issubset(df_faq_clean.columns):\n",
    "    print(\"عدد التكرارات:\", df_faq_clean.duplicated(subset=[\"question\", \"answer\"]).sum())\n",
    "    print(\"أسئلة بدون جواب:\", (df_faq_clean[\"answer\"].astype(str).str.strip() == \"\").sum())\n",
    "\n",
    "print(\"\\nالملفات الأساسية التي ستستخدمها بقية النوتبوكات:\")\n",
    "print(LAW_PROJECT_CSV)\n",
    "print(FAQ_PROJECT_CSV)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97df0f3d",
   "metadata": {},
   "source": [
    "## الخلاصة\n",
    "\n",
    "بعد تشغيل النوتبوك كاملاً ستكون لديك ملفات جاهزة للاستخدام في بقية المشروع بدون إعادة Scraping:\n",
    "\n",
    "```text\n",
    "saudi_labor_law_voice_agent_project/01_raw/saudi_labor_law_by_bab_articles.csv\n",
    "saudi_labor_law_voice_agent_project/01_raw/hrsd_faq_with_filters_classification.csv\n",
    "```\n",
    "\n",
    "المعايير المتوقعة لقبول مرحلة السحب:\n",
    "\n",
    "- مواد نظام العمل: 245 مادة.\n",
    "- المفقود من 1 إلى 245: قائمة فارغة.\n",
    "- التكرارات الحقيقية حسب `article_number_label`: صفر.\n",
    "- لا توجد مواد بدون نص.\n",
    "- وجود عمود `article_status` لتمييز المواد الفعالة والملغاة.\n",
    "- ملف FAQ محفوظ مع إزالة التكرار على أساس السؤال والجواب.\n",
    "\n",
    "> ملاحظة منهجية: هذه المرحلة مسؤولة فقط عن السحب والحفظ. نوتبوك المعالجة وRAG يجب أن يقرآ ملفات CSV المحفوظة من مجلد `01_raw` بدلاً من إعادة السحب من الموقع.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0968db84-1e80-4c3f-94c2-d5d49ccbcc98",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
