{ "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 }