{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## HTML을 parsing 하기 - 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### BeautifulSoup4 설치."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting bs4\n",
      "  Using cached https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz\n",
      "Requirement already satisfied: beautifulsoup4 in c:\\anaconda3\\lib\\site-packages (from bs4) (4.6.0)\n",
      "Building wheels for collected packages: bs4\n",
      "  Building wheel for bs4 (setup.py): started\n",
      "  Building wheel for bs4 (setup.py): finished with status 'done'\n",
      "  Created wheel for bs4: filename=bs4-0.0.1-cp37-none-any.whl size=1278 sha256=06533789adfb36bb318ff649b1ad9aed2b9f3152c808e448126b8f38fe9bcedf\n",
      "  Stored in directory: C:\\Users\\Gram\\AppData\\Local\\pip\\Cache\\wheels\\a0\\b0\\b2\\4f80b9456b87abedbc0bf2d52235414c3467d8889be38dd472\n",
      "Successfully built bs4\n",
      "Installing collected packages: bs4\n",
      "Successfully installed bs4-0.0.1\n"
     ]
    }
   ],
   "source": [
    "!pip install bs4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import bs4\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. BeautifulSoup 객체로 변환하여 parsing 하도록 한다:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.chdir(r\"C:\\Users\\Gram\\Desktop\\myPyCode\\02  데이터 수집과 처리 - 실습\\data\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#컴퓨터에 저장된 html파일로 parshing하기위해 파일 읽어오기\n",
    "f = open(\"page_01b.html\",\"r\")\n",
    "my_html = f.read()               \n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<!DOCTYPE HTML>\n",
      "<html lang=\"“en”\">\n",
      " <!-- 이 행은 주석. -->\n",
      " <head>\n",
      "  <meta content=\"text/html; charset=utf-8\"/>\n",
      "  <title>\n",
      "   이 것은 타이틀 태그 내용이다!\n",
      "  </title>\n",
      " </head>\n",
      " <!--  여기까지가 헤드. -->\n",
      " <body>\n",
      "  <h1>\n",
      "   헤더 1\n",
      "  </h1>\n",
      "  <h2>\n",
      "   헤더 2\n",
      "  </h2>\n",
      "  <h3>\n",
      "   헤더 3\n",
      "  </h3>\n",
      "  <h4>\n",
      "   헤더 4\n",
      "  </h4>\n",
      "  <h5>\n",
      "   헤더 5\n",
      "  </h5>\n",
      "  <p>\n",
      "   데이터 분석에 대해서 배워 봅시다.\n",
      "  </p>\n",
      "  <p>\n",
      "   이제 span 태그로\n",
      "   <span style=\"color:Red;\">\n",
      "    색을 바꾸어\n",
      "   </span>\n",
      "   봅시다.\n",
      "  </p>\n",
      "  <div>\n",
      "   다음은 unordered list 이다:\n",
      "   <ul>\n",
      "    <li>\n",
      "     아이템 하나.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 둘.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 셋.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 넷.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 다섯.\n",
      "    </li>\n",
      "   </ul>\n",
      "  </div>\n",
      "  <div>\n",
      "   다음은 ordered list이다:\n",
      "   <ol>\n",
      "    <li>\n",
      "     아이템 하나.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 둘.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 셋.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 넷.\n",
      "    </li>\n",
      "    <li>\n",
      "     아이템 다섯.\n",
      "    </li>\n",
      "   </ol>\n",
      "  </div>\n",
      "  <div>\n",
      "   다음은 ordered list인데 색상을 넣어 본다:\n",
      "   <ol>\n",
      "    <li>\n",
      "     <span style=\"color:Red;\">\n",
      "      아이템 하나.\n",
      "     </span>\n",
      "    </li>\n",
      "    <li>\n",
      "     <span style=\"color:Blue;\">\n",
      "      아이템 둘.\n",
      "     </span>\n",
      "    </li>\n",
      "    <li>\n",
      "     <span style=\"color:Green;\">\n",
      "      아이템 셋.\n",
      "     </span>\n",
      "    </li>\n",
      "    <li>\n",
      "     <span style=\"color:Orange;\">\n",
      "      아이템 넷.\n",
      "     </span>\n",
      "    </li>\n",
      "    <li>\n",
      "     <span style=\"color:Violet;\">\n",
      "      아이템 다섯.\n",
      "     </span>\n",
      "    </li>\n",
      "   </ol>\n",
      "  </div>\n",
      "  <p>\n",
      "   이 것은\n",
      "   <a href=\"http://www.naver.com\">\n",
      "    네이버\n",
      "   </a>\n",
      "   로 가는 하이퍼링크이다.\n",
      "   <br/>\n",
      "   <br/>\n",
      "   이 것은\n",
      "   <a href=\".\\page_01a.html\">\n",
      "    로컬 파일\n",
      "   </a>\n",
      "   로 가는 하이퍼링크이다.\n",
      "   <br/>\n",
      "   <br/>\n",
      "   폰트를\n",
      "   <em>\n",
      "    한번 바꾸어\n",
      "   </em>\n",
      "   보도록 한다:  이 것은\n",
      "   <strong>\n",
      "    볼드\n",
      "   </strong>\n",
      "   폰트이고, 이 것은\n",
      "   <b>\n",
      "    볼드\n",
      "   </b>\n",
      "   폰트이며, \n",
      "이 것은\n",
      "   <i>\n",
      "    이탤릭\n",
      "   </i>\n",
      "   폰트이고, 또한 이 것은\n",
      "   <u>\n",
      "    밑줄친\n",
      "   </u>\n",
      "   폰트이다.\n",
      "  </p>\n",
      "  <div>\n",
      "   이제는 아래와 같이 테이블을 만들어 보도록 한다.\n",
      "   <br/>\n",
      "   <br/>\n",
      "   <table>\n",
      "    <thead>\n",
      "     <tr>\n",
      "      <th>\n",
      "       Column 1\n",
      "      </th>\n",
      "      <th>\n",
      "       Column 2\n",
      "      </th>\n",
      "      <th>\n",
      "       Column 3\n",
      "      </th>\n",
      "     </tr>\n",
      "    </thead>\n",
      "    <tr>\n",
      "     <td>\n",
      "      (1,1)\n",
      "     </td>\n",
      "     <td>\n",
      "      (1,2)\n",
      "     </td>\n",
      "     <td>\n",
      "      (1,3)\n",
      "     </td>\n",
      "    </tr>\n",
      "    <tr>\n",
      "     <td>\n",
      "      (2,1)\n",
      "     </td>\n",
      "     <td>\n",
      "      (2,2)\n",
      "     </td>\n",
      "     <td>\n",
      "      (2,3)\n",
      "     </td>\n",
      "    </tr>\n",
      "   </table>\n",
      "  </div>\n",
      "  <div>\n",
      "   <br/>\n",
      "   <br/>\n",
      "   그리고, 다음 이미지도 출력해 본다.\n",
      "   <br/>\n",
      "   <figure>\n",
      "    <img alt=\"Figure not found in this folder!!!\" height=\"200\" src=\".\\fig_01.png\" width=\"250\"/>\n",
      "    <br/>\n",
      "    <figurecaption>\n",
      "     위는 막대그래프를 모여주는 그림.\n",
      "    </figurecaption>\n",
      "   </figure>\n",
      "  </div>\n",
      "  <div>\n",
      "   <br/>\n",
      "   마지막으로\n",
      "   <span style=\"color:Blue;\">\n",
      "    input\n",
      "   </span>\n",
      "   태그와\n",
      "   <span style=\"color:Blue;\">\n",
      "    button\n",
      "   </span>\n",
      "   태그,\n",
      "   <span style=\"color:Blue;\">\n",
      "    select\n",
      "   </span>\n",
      "   태그를 만들어 본다.\n",
      "   <br/>\n",
      "   <br/>\n",
      "   <input type=\"text\" value=\"test1\"/>\n",
      "   <input type=\"text\" value=\"test2\"/>\n",
      "   <input type=\"text\" value=\"test3\"/>\n",
      "   <button>\n",
      "    Button 1\n",
      "   </button>\n",
      "   <button>\n",
      "    Button 2\n",
      "   </button>\n",
      "   <button>\n",
      "    Button 3\n",
      "   </button>\n",
      "   <br/>\n",
      "   <br/>\n",
      "   <select>\n",
      "    <option value=\"선택_1\">\n",
      "     선택_1\n",
      "    </option>\n",
      "    <option value=\"선택_2\">\n",
      "     선택_2\n",
      "    </option>\n",
      "    <option value=\"선택_3\">\n",
      "     선택_3\n",
      "    </option>\n",
      "    <option value=\"선택_4\">\n",
      "     선택_4\n",
      "    </option>\n",
      "   </select>\n",
      "   <br/>\n",
      "   <br/>\n",
      "   끝~~\n",
      "   <br/>\n",
      "   <br/>\n",
      "  </div>\n",
      " </body>\n",
      " <!-- 여기까지가 몸통. -->\n",
      "</html>\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 3 가지 parser 중 'html.parser' 선택\n",
    "soup = bs4.BeautifulSoup(my_html, 'html.parser')     #res.text가 텍스트(문자열), BeautifulSoup4로 파싱해 soup객체로 변환시킴 \n",
    "                                                     #soup객체 생성 \n",
    "print(soup.prettify())  #soup객체에서 prettify메서드 사용(조금 더 읽기 쉬운 형태로 출력위해)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 여러 태그에 직접 접근해 본다: 우리는 주로 text만 사용할 예정"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### title 태그"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<title>이 것은 타이틀 태그 내용이다!</title>\n",
      "이 것은 타이틀 태그 내용이다!\n"
     ]
    }
   ],
   "source": [
    "print(soup.title)         # 첫 title 태그 전체 나옴          \n",
    "print(soup.title.text)    # 첫 title 태그의 text 속성    #내용 보여줌, 하위태그 포함, 문자열 타입"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### p 태그(text, string, contents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<p> 데이터 분석에 대해서 배워 봅시다. </p>\n",
      " 데이터 분석에 대해서 배워 봅시다. \n",
      " 데이터 분석에 대해서 배워 봅시다. \n",
      "[' 데이터 분석에 대해서 배워 봅시다. ']\n"
     ]
    }
   ],
   "source": [
    "print(soup.p)             # 첫 p 태그 전체 나옴\n",
    "print(soup.p.text)        # 첫 p 태그의 text 속성       #내용 보여줌, 하위태그 포함, 문자열 타입    \n",
    "print(soup.p.string)      # 첫 p 태그의 string 속성     #내용 보여줌, 하위태그 미포함   #하위객체가 없어 위랑 같은 결과\n",
    "print(soup.p.contents)    # 첫 p 태그의 contents 속성   #리스트형태로 자식태그 가져옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### p 태그(attrs, get)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{}\n",
      "None\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print(soup.p.attrs)           # 첫 p 태그의 attrs.      #속성과 해당값을 딕셔너리로 변환    \n",
    "#print(soup.p.attrs['class']) => 이렇게 하면 클래스라는 키가 없어서 아무것도 안나옴 \n",
    "\n",
    "print(soup.p.get('class'))    # 첫 p 태그의 class.     #class속성 값을 가져옴     \n",
    "print(soup.p.get('id'))       # 첫 p 태그의 id.        #id속성 값을 가져옴\n",
    "\n",
    "#값이 없어서 아무것도 안나옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### span 태그(text, string, contents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<span style=\"color:Red;\">색을 바꾸어</span>\n",
      "색을 바꾸어\n",
      "색을 바꾸어\n",
      "['색을 바꾸어']\n"
     ]
    }
   ],
   "source": [
    "print(soup.span)             # 첫 span 태그 전체.\n",
    "print(soup.span.text)        # 첫 span 태그의 text 속성.         #내용 보여줌, 하위태그 포함, 문자열 타입\n",
    "print(soup.span.string)      # 첫 span 태그의 string 속성.       #내용 보여줌, 하위태그 미포함\n",
    "print(soup.span.contents)    # 첫 span 태그의 contents 속성.     #리스트형태로 자식태그 가져옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### span 태그(attrs, get)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'style': 'color:Red;'}\n",
      "None\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print(soup.span.attrs)           # 첫 span 태그의 attrs.   #속성과 해당값을 딕셔너리로 변환\n",
    "print(soup.span.get('class'))    # 첫 span 태그의 class.   #class속성 값을 가져옴\n",
    "print(soup.span.get('id'))       # 첫 span 태그의 id.      #id속성 값을 가져옴"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "color:Red;\n",
      "color:Red;\n"
     ]
    }
   ],
   "source": [
    "print(soup.span.get('style'))    # 첫 span 태그의 style.   #style속성 값을 가져옴\n",
    "print(soup.span.attrs['style'])  # 첫 span 태그의 style.   #대괄호해도 위의 결과 같음"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### div 태그(text, string, contents)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'bs4.element.Tag'>\n",
      "<div>\n",
      "다음은 unordered list 이다:\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "</div>\n"
     ]
    }
   ],
   "source": [
    "my_div = soup.div               # div 태그 객체.               #.Tag라고 뜸\n",
    "print(type(my_div))             # div 태그 객체의 type 출력.   \n",
    "print(my_div)                   # 첫 div 태그 전체출력"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "다음은 unordered list 이다:\n",
      "\n",
      " 아이템 하나. \n",
      " 아이템 둘. \n",
      " 아이템 셋. \n",
      " 아이템 넷. \n",
      " 아이템 다섯. \n",
      "\n",
      "\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print(my_div.text)        # 첫 div 태그의 text 속성.       #내용 보여줌, 하위태그 포함, 문자열 타입\n",
    "print(my_div.string)      # 첫 div 태그의 string 속성.     #div태그에 string속성이 없어 None나옴"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['\\n다음은 unordered list 이다:\\n', <ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>, '\\n']\n"
     ]
    }
   ],
   "source": [
    "print(my_div.contents)    # 첫 div 태그의 contents 속성.  #리스트형태로 자식태그 가져옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### div 태그(attrs, get)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{}\n",
      "None\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "print(my_div.attrs)           # 첫 div 태그의 attrs.      #속성과 해당값을 딕셔너리로 변환\n",
    "print(my_div.get('class'))    # 첫 div 태그의 class.      #class속성 값을 가져옴\n",
    "print(my_div.get('id'))       # 첫 div 태그의 id.         #id속성 값을 가져옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### img 태그(attrs, get)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'bs4.element.Tag'>\n",
      "{'src': '.\\\\fig_01.png', 'width': '250', 'height': '200', 'alt': 'Figure not found in this folder!!!'}\n"
     ]
    }
   ],
   "source": [
    "my_img = soup.img               # img 태그 객체.      \n",
    "print(type(my_img))             # img 태그 객체의 type 출력.   \n",
    "print(my_img.attrs)             # 속성과 해당값을 딕셔너리로 변환\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".\\fig_01.png\n",
      ".\\fig_01.png\n"
     ]
    }
   ],
   "source": [
    "print(my_img.get('src'))        #src속성 값을 가져옴\n",
    "print(my_img.attrs['src'])      #src속성 값을 가져옴    #대괄호해도 위의 결과 같음"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Figure not found in this folder!!!\n"
     ]
    }
   ],
   "source": [
    "print(my_img.get('alt'))        #src속성 값을 가져옴    #alt(대안텍스트)-이미지 못가져왔을 때 보여주는 대체문구"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### a 태그"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'href': 'http://www.naver.com'}\n"
     ]
    }
   ],
   "source": [
    "my_a = soup.a                  # a 태그 객체.   \n",
    "print(my_a.attrs)              # 속성과 해당값을 딕셔너리로 변환"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://www.naver.com\n"
     ]
    }
   ],
   "source": [
    "print(my_a.get('href'))        #href속성 값을 가져옴"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 부모, 자식, 형제 태그에 접근해 본다: 선호하는 방식은 아님\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 자식 태그"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : None\n",
      "------------------------------\n",
      "1 : ul\n",
      "------------------------------\n",
      "2 : None\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_div = soup.div                             # div 태그 객체.\n",
    "my_div_children = my_div.children             # div 태그의 자식 객체.      #my_div=my_div_children임\n",
    "n = 0                                      \n",
    "for x in my_div_children:                     # iterator 객체는 for 루프로 접근 => div_children 가지고 반복하겠다\n",
    "    print(str(n) + \" : \" + str(x.name))       # div_children을 for루프에 넣음 => 태그의 이름이 나옴\n",
    "    print(\"-\"*30)\n",
    "    n += 1                                    #위에서 'Wn'이런게 이름없는데 div_children으로 잡혀서 none으로 나온듯"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : \n",
      "\n",
      "\n",
      "다음은 unordered list 이다:\n",
      "\n",
      "------------------------------\n",
      "1 : \n",
      "\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "------------------------------\n",
      "2 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_div_children = my_div.children                     # div 태그의 자식들. Iteration 하기 전 리셋. \n",
    "my_div_children_list = [x for x in my_div_children]   # iterator 객체를 list로 변환.\n",
    "n = 0\n",
    "for x in my_div_children_list:                  #iterator로 리스트만들거나, 리스트로 리스트 만들거나\n",
    "    print(str(n) + \" : \\n\")                     #div_children에서 값을 하나 뽑아 만듬, \\n으로 라인 체인지\n",
    "                                                #리스트만들어 또 iterator\n",
    "    print(x)                                    #ul 나옴\n",
    "    print(\"-\"*30)\n",
    "    n += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**for문 설명**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=range(10)        #이건 리스트 아님 = > 이터레이션 할수 있음\n",
    "x \n",
    "[y*2 for y in x]   #x에서 y값 뽑아서 y*2를 리스트로 만들어라"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 2, 4, 6, 8]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x=range(10)                    #이건 리스트 아님\n",
    "[y for y in x if y % 2 ==0]   #2의 배수인경우 리스트를 마들어줘라"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 부모 태그"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : div\n",
      "------------------------------\n",
      "1 : body\n",
      "------------------------------\n",
      "2 : html\n",
      "------------------------------\n",
      "3 : [document]\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_ul = soup.ul                           # ul 태그에 접근\n",
    "my_ul_parents = my_ul.parents             # ul 태그의 부모들. Iteration 하기 전 리셋. \n",
    "n = 0\n",
    "for x in my_ul_parents:\n",
    "    print(str(n) + \" : \" + x.name)\n",
    "    print(\"-\"*30)\n",
    "    n += 1        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : \n",
      "\n",
      "<div>\n",
      "다음은 unordered list 이다:\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "</div>\n",
      "------------------------------\n",
      "1 : \n",
      "\n",
      "<body>\n",
      "<h1> 헤더 1 </h1>\n",
      "<h2> 헤더 2 </h2>\n",
      "<h3> 헤더 3 </h3>\n",
      "<h4> 헤더 4 </h4>\n",
      "<h5> 헤더 5 </h5>\n",
      "<p> 데이터 분석에 대해서 배워 봅시다. </p>\n",
      "<p> 이제 span 태그로 <span style=\"color:Red;\">색을 바꾸어</span> 봅시다. </p>\n",
      "<div>\n",
      "다음은 unordered list 이다:\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list이다:\n",
      "<ol>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ol>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list인데 색상을 넣어 본다:\n",
      "<ol>\n",
      "<li> <span style=\"color:Red;\">아이템 하나.</span> </li>\n",
      "<li> <span style=\"color:Blue;\">아이템 둘. </span> </li>\n",
      "<li> <span style=\"color:Green;\">아이템 셋. </span> </li>\n",
      "<li> <span style=\"color:Orange;\">아이템 넷. </span> </li>\n",
      "<li> <span style=\"color:Violet;\">아이템 다섯. </span> </li>\n",
      "</ol>\n",
      "</div>\n",
      "<p>\n",
      "이 것은  <a href=\"http://www.naver.com\"> 네이버</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "이 것은  <a href=\".\\page_01a.html\"> 로컬 파일</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "폰트를 <em> 한번 바꾸어 </em> 보도록 한다:  이 것은 <strong> 볼드 </strong> 폰트이고, 이 것은 <b> 볼드 </b> 폰트이며, \n",
      "이 것은 <i> 이탤릭 </i> 폰트이고, 또한 이 것은 <u>밑줄친</u> 폰트이다.\n",
      "</p>\n",
      "<div>\n",
      "이제는 아래와 같이 테이블을 만들어 보도록 한다. <br/> <br/>\n",
      "<table>\n",
      "<thead>\n",
      "<tr>\n",
      "<th> Column 1 </th> <th> Column 2 </th> <th> Column 3 </th>\n",
      "</tr>\n",
      "</thead>\n",
      "<tr>\n",
      "<td> (1,1) </td> <td> (1,2) </td> <td> (1,3) </td>\n",
      "</tr>\n",
      "<tr>\n",
      "<td> (2,1) </td> <td> (2,2) </td> <td> (2,3) </td>\n",
      "</tr>\n",
      "</table>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "<br/>\n",
      "\n",
      "그리고, 다음 이미지도 출력해 본다. <br/>\n",
      "<figure>\n",
      "<img alt=\"Figure not found in this folder!!!\" height=\"200\" src=\".\\fig_01.png\" width=\"250\"/> <br/>\n",
      "<figurecaption>위는 막대그래프를 모여주는 그림.</figurecaption>\n",
      "</figure>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "마지막으로 <span style=\"color:Blue;\">input</span> 태그와 <span style=\"color:Blue;\">button</span> 태그,  <span style=\"color:Blue;\">select</span> 태그를 만들어 본다. \n",
      "<br/> <br/>\n",
      "<input type=\"text\" value=\"test1\"/>\n",
      "<input type=\"text\" value=\"test2\"/>\n",
      "<input type=\"text\" value=\"test3\"/>\n",
      "<button>Button 1</button>\n",
      "<button>Button 2</button>\n",
      "<button>Button 3</button>\n",
      "<br/> <br/>\n",
      "<select>\n",
      "<option value=\"선택_1\">선택_1</option>\n",
      "<option value=\"선택_2\">선택_2</option>\n",
      "<option value=\"선택_3\">선택_3</option>\n",
      "<option value=\"선택_4\">선택_4</option>\n",
      "</select>\n",
      "<br/> <br/>\n",
      "끝~~\n",
      "<br/> <br/>\n",
      "</div>\n",
      "</body>\n",
      "------------------------------\n",
      "2 : \n",
      "\n",
      "<html lang=\"“en”\">\n",
      "<!-- 이 행은 주석. -->\n",
      "<head>\n",
      "<meta content=\"text/html; charset=utf-8\"/>\n",
      "<title>이 것은 타이틀 태그 내용이다!</title>\n",
      "</head>\n",
      "<!--  여기까지가 헤드. -->\n",
      "<body>\n",
      "<h1> 헤더 1 </h1>\n",
      "<h2> 헤더 2 </h2>\n",
      "<h3> 헤더 3 </h3>\n",
      "<h4> 헤더 4 </h4>\n",
      "<h5> 헤더 5 </h5>\n",
      "<p> 데이터 분석에 대해서 배워 봅시다. </p>\n",
      "<p> 이제 span 태그로 <span style=\"color:Red;\">색을 바꾸어</span> 봅시다. </p>\n",
      "<div>\n",
      "다음은 unordered list 이다:\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list이다:\n",
      "<ol>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ol>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list인데 색상을 넣어 본다:\n",
      "<ol>\n",
      "<li> <span style=\"color:Red;\">아이템 하나.</span> </li>\n",
      "<li> <span style=\"color:Blue;\">아이템 둘. </span> </li>\n",
      "<li> <span style=\"color:Green;\">아이템 셋. </span> </li>\n",
      "<li> <span style=\"color:Orange;\">아이템 넷. </span> </li>\n",
      "<li> <span style=\"color:Violet;\">아이템 다섯. </span> </li>\n",
      "</ol>\n",
      "</div>\n",
      "<p>\n",
      "이 것은  <a href=\"http://www.naver.com\"> 네이버</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "이 것은  <a href=\".\\page_01a.html\"> 로컬 파일</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "폰트를 <em> 한번 바꾸어 </em> 보도록 한다:  이 것은 <strong> 볼드 </strong> 폰트이고, 이 것은 <b> 볼드 </b> 폰트이며, \n",
      "이 것은 <i> 이탤릭 </i> 폰트이고, 또한 이 것은 <u>밑줄친</u> 폰트이다.\n",
      "</p>\n",
      "<div>\n",
      "이제는 아래와 같이 테이블을 만들어 보도록 한다. <br/> <br/>\n",
      "<table>\n",
      "<thead>\n",
      "<tr>\n",
      "<th> Column 1 </th> <th> Column 2 </th> <th> Column 3 </th>\n",
      "</tr>\n",
      "</thead>\n",
      "<tr>\n",
      "<td> (1,1) </td> <td> (1,2) </td> <td> (1,3) </td>\n",
      "</tr>\n",
      "<tr>\n",
      "<td> (2,1) </td> <td> (2,2) </td> <td> (2,3) </td>\n",
      "</tr>\n",
      "</table>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "<br/>\n",
      "\n",
      "그리고, 다음 이미지도 출력해 본다. <br/>\n",
      "<figure>\n",
      "<img alt=\"Figure not found in this folder!!!\" height=\"200\" src=\".\\fig_01.png\" width=\"250\"/> <br/>\n",
      "<figurecaption>위는 막대그래프를 모여주는 그림.</figurecaption>\n",
      "</figure>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "마지막으로 <span style=\"color:Blue;\">input</span> 태그와 <span style=\"color:Blue;\">button</span> 태그,  <span style=\"color:Blue;\">select</span> 태그를 만들어 본다. \n",
      "<br/> <br/>\n",
      "<input type=\"text\" value=\"test1\"/>\n",
      "<input type=\"text\" value=\"test2\"/>\n",
      "<input type=\"text\" value=\"test3\"/>\n",
      "<button>Button 1</button>\n",
      "<button>Button 2</button>\n",
      "<button>Button 3</button>\n",
      "<br/> <br/>\n",
      "<select>\n",
      "<option value=\"선택_1\">선택_1</option>\n",
      "<option value=\"선택_2\">선택_2</option>\n",
      "<option value=\"선택_3\">선택_3</option>\n",
      "<option value=\"선택_4\">선택_4</option>\n",
      "</select>\n",
      "<br/> <br/>\n",
      "끝~~\n",
      "<br/> <br/>\n",
      "</div>\n",
      "</body>\n",
      "<!-- 여기까지가 몸통. -->\n",
      "</html>\n",
      "------------------------------\n",
      "3 : \n",
      "\n",
      "<!DOCTYPE HTML>\n",
      "\n",
      "<html lang=\"“en”\">\n",
      "<!-- 이 행은 주석. -->\n",
      "<head>\n",
      "<meta content=\"text/html; charset=utf-8\"/>\n",
      "<title>이 것은 타이틀 태그 내용이다!</title>\n",
      "</head>\n",
      "<!--  여기까지가 헤드. -->\n",
      "<body>\n",
      "<h1> 헤더 1 </h1>\n",
      "<h2> 헤더 2 </h2>\n",
      "<h3> 헤더 3 </h3>\n",
      "<h4> 헤더 4 </h4>\n",
      "<h5> 헤더 5 </h5>\n",
      "<p> 데이터 분석에 대해서 배워 봅시다. </p>\n",
      "<p> 이제 span 태그로 <span style=\"color:Red;\">색을 바꾸어</span> 봅시다. </p>\n",
      "<div>\n",
      "다음은 unordered list 이다:\n",
      "<ul>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ul>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list이다:\n",
      "<ol>\n",
      "<li> 아이템 하나. </li>\n",
      "<li> 아이템 둘. </li>\n",
      "<li> 아이템 셋. </li>\n",
      "<li> 아이템 넷. </li>\n",
      "<li> 아이템 다섯. </li>\n",
      "</ol>\n",
      "</div>\n",
      "<div>\n",
      "다음은 ordered list인데 색상을 넣어 본다:\n",
      "<ol>\n",
      "<li> <span style=\"color:Red;\">아이템 하나.</span> </li>\n",
      "<li> <span style=\"color:Blue;\">아이템 둘. </span> </li>\n",
      "<li> <span style=\"color:Green;\">아이템 셋. </span> </li>\n",
      "<li> <span style=\"color:Orange;\">아이템 넷. </span> </li>\n",
      "<li> <span style=\"color:Violet;\">아이템 다섯. </span> </li>\n",
      "</ol>\n",
      "</div>\n",
      "<p>\n",
      "이 것은  <a href=\"http://www.naver.com\"> 네이버</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "이 것은  <a href=\".\\page_01a.html\"> 로컬 파일</a>로 가는 하이퍼링크이다. <br/> <br/>\n",
      "폰트를 <em> 한번 바꾸어 </em> 보도록 한다:  이 것은 <strong> 볼드 </strong> 폰트이고, 이 것은 <b> 볼드 </b> 폰트이며, \n",
      "이 것은 <i> 이탤릭 </i> 폰트이고, 또한 이 것은 <u>밑줄친</u> 폰트이다.\n",
      "</p>\n",
      "<div>\n",
      "이제는 아래와 같이 테이블을 만들어 보도록 한다. <br/> <br/>\n",
      "<table>\n",
      "<thead>\n",
      "<tr>\n",
      "<th> Column 1 </th> <th> Column 2 </th> <th> Column 3 </th>\n",
      "</tr>\n",
      "</thead>\n",
      "<tr>\n",
      "<td> (1,1) </td> <td> (1,2) </td> <td> (1,3) </td>\n",
      "</tr>\n",
      "<tr>\n",
      "<td> (2,1) </td> <td> (2,2) </td> <td> (2,3) </td>\n",
      "</tr>\n",
      "</table>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "<br/>\n",
      "\n",
      "그리고, 다음 이미지도 출력해 본다. <br/>\n",
      "<figure>\n",
      "<img alt=\"Figure not found in this folder!!!\" height=\"200\" src=\".\\fig_01.png\" width=\"250\"/> <br/>\n",
      "<figurecaption>위는 막대그래프를 모여주는 그림.</figurecaption>\n",
      "</figure>\n",
      "</div>\n",
      "<div>\n",
      "<br/>\n",
      "마지막으로 <span style=\"color:Blue;\">input</span> 태그와 <span style=\"color:Blue;\">button</span> 태그,  <span style=\"color:Blue;\">select</span> 태그를 만들어 본다. \n",
      "<br/> <br/>\n",
      "<input type=\"text\" value=\"test1\"/>\n",
      "<input type=\"text\" value=\"test2\"/>\n",
      "<input type=\"text\" value=\"test3\"/>\n",
      "<button>Button 1</button>\n",
      "<button>Button 2</button>\n",
      "<button>Button 3</button>\n",
      "<br/> <br/>\n",
      "<select>\n",
      "<option value=\"선택_1\">선택_1</option>\n",
      "<option value=\"선택_2\">선택_2</option>\n",
      "<option value=\"선택_3\">선택_3</option>\n",
      "<option value=\"선택_4\">선택_4</option>\n",
      "</select>\n",
      "<br/> <br/>\n",
      "끝~~\n",
      "<br/> <br/>\n",
      "</div>\n",
      "</body>\n",
      "<!-- 여기까지가 몸통. -->\n",
      "</html>\n",
      "\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_ul_parents = my_ul.parents                     # ul 태그의 부모들. Iteration 하기 전 리셋. \n",
    "my_ul_parents_list = [x for x in my_ul_parents]   #리스트화 함 \n",
    "n = 0\n",
    "for x in my_ul_parents_list:\n",
    "    print(str(n) + \" : \\n\")\n",
    "    print(x)\n",
    "    print(\"-\"*30)\n",
    "    n += 1                                        #위의위에 것까지 나오니 결국 다 나온 것(상위의 상위) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 형제 태그"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : None\n",
      "------------------------------\n",
      "1 : li\n",
      "------------------------------\n",
      "2 : None\n",
      "------------------------------\n",
      "3 : li\n",
      "------------------------------\n",
      "4 : None\n",
      "------------------------------\n",
      "5 : li\n",
      "------------------------------\n",
      "6 : None\n",
      "------------------------------\n",
      "7 : li\n",
      "------------------------------\n",
      "8 : None\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_li = soup.li                             # li 태그 객체.\n",
    "my_li_siblings = my_li.next_siblings        # li 태그 이후의 형제들(-s). Iteration 하기 전 리셋. \n",
    "n = 0                                        \n",
    "for x in my_li_siblings:                    # iterator 객체는 for 루프로 접근.\n",
    "    print(str(n) + \" : \" + str(x.name))     #텍스트나 라인체인지가 텍스트로 잡혀서 none 나옴\n",
    "    print(\"-\"*30)\n",
    "    n += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "<li> 아이템 둘. </li>\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "<li> 아이템 셋. </li>\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "<li> 아이템 넷. </li>\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "<li> 아이템 다섯. </li>\n",
      "------------------------------\n",
      "0 : \n",
      "\n",
      "\n",
      "\n",
      "------------------------------\n"
     ]
    }
   ],
   "source": [
    "my_li_siblings = my_li.next_siblings        # li 태그 이후의 형제들. Iteration 하기 전 리셋. \n",
    "my_li_siblings_list = [x for x in my_li_siblings]\n",
    "n = 0\n",
    "for x in my_li_siblings_list:       \n",
    "    print(str(n) + \" : \\n\")                 # 빈칸있는 이유는 '/n'라인체인지가 siblings로 잡혀서(결론은 깔끔하지 않음)\n",
    "    print(x)                                # 아이템원은 왜 siblings로 잡힘?\n",
    "    print(\"-\"*30)                           # 아이템원 기준으로 next siblings가져오니 두개,세개 잡힘"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}