출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] '분류 전체보기' 카테고리의 글 목록 (5 Page) :: 하나둘셋넷
728x90

Table 다루기

  • 기초 단축키
    • 주석 : ctrl + /
    • 라이브 서버 실행 : ALT + L + O
    • HTML 기본 구성 요소 꺼내기 : ! + Enter

결과물

"rowspan", "colspan", "align", "th", "bgcolor", "border" 등의 기능을 사용하여 테이블을 꾸미는 실습을 진행합니다.

  1. "rowspan" : 아래로 정해진 숫자만큼 행을 병합합니다.
  2. "colspan" : 아래로 정해진 숫자만큼 열을 병합합니다.
  3. "align" : 텍스트의 정렬 방향을 결정합니다.
  4. "th" : 표의 헤더 부분을 작성합니다.
  5. "bgcolor" : 배경색을 설정합니다.
  6. "border" : 표 테두리의 두께를 설정합니다.

 

가장 기본적인 표

    <table border = '1px solid black'>
        <tr>
            <td>1번칸</td>
            <td>2번칸</td>
            
        </tr>

        <tr>
            <td>3번칸</td>
            <td>4번칸</td>
        </tr>

        <tr>
            <td>5번칸</td>
            <td>6번칸</td>
        </tr>
    </table>

 

가장 기본적인 표 구조입니다.

<table border = '1px solid black'>을 통하여 표 테두리의 두께를 설정합니다.

<tr></tr>을 통해 행을 지정하고, <td></td>를 설정하여 각 열마다 정보를 대입합니다.

총 3행 2열의 테이블이 생성됩니다.

 

"rowspan", "colspan" 활용

<table border="">
        <tr>
            <td>메뉴</td>
            <td>가격</td>
            <td>특이사항</td>
        </tr>

        <tr>
            <td>아메리카노</td>
            <td>3000</td>
            <td rowspan="3">사계절 가능</td>
        </tr>

        <tr>
            <td>카페라떼</td>
            <td>3500</td>
        </tr>

        <tr>
            <td>자바칩프라푸치노</td>
            <td>4500</td>
        </tr>

        <tr>
            <td colspan="3">청귤에이드는 조금만 기다려주세요</td>
        </tr>
    </table>

 

rowspan과 colspan을 모두 활용한 테이블 구조입니다.

아메티카노의 3번째 컬럼 아래로 행 3개를 병합하고 싶기 때문에 <td rowspan ="3">사계절 가능</td>로 작성했습니다.

마지막 행에서는 해당 열들을 모두 병합하고 싶기 때문에 <td colspan="3"></td>를 사용했습니다.

총 5행 3열의 테이블이 생성되며 이중에서 3개의 행이 병합된 부분이 있고, 마지마 행의 컬럼은 모두 병합됩니다.

 

th, width, bgcolor, align을 활용한 테이블 꾸미기

<table border = "1px solid balck" width = "300px">
        <tr bgcolor = 'pink'>
            <th width = '100px'> 메뉴 </th>
            <th>가격</th>
            <th>특이사항</th>
        </tr>

        <tr>
            <td>아메리카노</td>
            <td align = 'right'>3000</td>
            <td rowspan='3'>사계절가능</td>
        </tr>

        <tr>
            <td>카페라떼</td>
            <td align = 'right'>3500</td>
        </tr>

        <tr>
            <td>자바칩프라푸치노</td>
            <td align = "right">4500</td>
        </tr>

        <tr>
            <td colspan = '3'>청귤에이드는 조금만 기다려주세요~</td>
        </tr>

    </table>

<table border = "1px solid black" width = "300px">를 통하여 테두리의 색과 두께, 전체 테이블의 너비를 정합니다.

<tr bgcolor = 'pink'> 를 통해 해당 행의 배경색을 지정합니다.

<th width = 100px>메뉴</th>를 통해 테이블 헤더 부분 컬럼 내용을 작성합니다.

<td align = 'right'>3000</td>를 통하여 해당 글자를 오른쪽으로 정렬합니다.

<td rowspan = '3'>사계절가능</td>을 통하여 해당 행 아래로 3개의 행들을 병합합니다.

<td colspan='3'>청귤에이드는 조금만 기다려주세요~</td>를 통하여 해당 행의 컬럼 3개를 병합합니다.

 

728x90

'HTML 기초' 카테고리의 다른 글

HTML, CSS - Box 다루기  (0) 2024.04.12
728x90

메타코드 강의 후기

메타코드M (mcode.co.kr)

 

메타코드M

빅데이터 , AI 강의 플랫폼 & IT 현직자 모임 플랫폼ㅣ메타코드 커뮤니티 일원이 되시기 바랍니다.

mcode.co.kr

Javascript로 만든 페이지에 대응하는 방법을 배울 것입니다.

 

개발자 모드로 박스 컨텐츠의 정보를 확인합니다.

 

박스컨텐츠에 대한 정보는 <a></a> 태그로 되어있는 경우가 많습니다.

클래스 부분의 정보를 복사하여 가져옵니다.

 

box_contents = soup.find_all('a', class_='box-content flex-style')
box_contents

 

가져온 클래스 정보를 코드에 위와 같이 입력합니다.

여러 개의 정보를 가져와야 하므로 "soup.find_all"을 사용했습니다.

 

크롤링이 되지 않는 경우 -> selenium의 webdriver 사용

 

 

크롤링이 되지 않는 경우에는 selenium으로부터 webdriver를 가져와서 크롤링을 진행합니다.

필요한 라이브러리들은 위 사진에서 확인할 수 있습니다.

정적인 페이지의 경우는 Requests와 Beautifulsoup으로 크롤링이 가능하며,

동적인 페이지의 경우는 Selenium을 사용하는 경우에 해당합니다.

 

Selenium을 통한 크롤링 준비

 

 

Selenium의 webdriver를 통하여 웹 드라이버를 실행하는 코드입니다.

해당 코드를 실행하면 새로운 브라우저를 통하여 url 주소에 해당하는 페이지가 실행됨을 확인할 수 있습니다.

wait의 경우 브라우저의 안정적인 실행을 위해 설정하며, 이 경우에는 10초로 설정했습니다.

html 변수에 페이지 소스를 담아 이후 크롤링에 사용할 것입니다.

 

크롤링 시도

 

 

soup = BeautifulSoup(html, 'html.parser')를 통해 soup 변수에 selenium을 통하여 얻은 페이지 소스를 대입하여 크롤링을 시도한 결과 출력에서 볼 수 있듯이 정보를 가져오는 것에 성공했음을 확인할 수 있습니다.

박스 컨텐츠를 가져오는 것이 목적이기 때문에 F12 개발자 모드에서 확인한 클래스 이름인 "box_content flex-style"을 형식에 맞게 입력하였습니다.

태그의 종류는 "a 태그"에 해당합니다.

 

불러온 정보 다루기

 

 

len 함수를 통해 확인할 수 있듯이 현재 box_contents는 리스트 형식이며, 그 안에 값들은 12개가 담겨있습니다.

box_contents[0] 등으로 숫자를 입력하며 각 위치에 어떤 값들이 담겨 있는지 쉽게 확인할 수 있습니다.

태그 정보와 클래스 이름도 확인할 수 있습니다.

리스트 구조이므로 후에 for문 등 다양한 방법으로 데이터를 다루기에 용이한 상태가 되었습니다.

 

원하는 정보 선택 출력

 

 

위의 방식을 통하여 컨텐츠에서 원하는 정보만 출력할 수 있습니다.

box_contents는 리스트 구조이므로 먼저 인덱스 번호를 통해 어떤 정보를 가져올 것인지 정합니다.

해당 요소의 태그와 class 정보는 쉽게 확인할 수 있습니다.

".find()" 안에 확인한 태그 정보와 class 이름을 넣으면 위에서 볼 수 있듯이 필요한 정보를 출력할 수 있습니다.

 

리스트에 정보 담기

 

리스트 구조를 활용하면 페이지에서 원하는 정보들을 편하게 추출하고 관리할 수 있습니다.

url 변수에 기본 주소 + href 정보를 통해 페이지에 대한 주소 정보를 담습니다.

title, body, date 변수에 개발자 모드에서 확인한 태그 정보와 클래스 정보를 활용하여 정보를 담습니다.

반복문의 각 변수들을 해당 리스트에 append하여 정보를 추가합니다.

box_contents의 길이만큼 반복문이 진행됩니다.

 

csv 파일로 저장

 

리스트 구조를 딕셔너리 구조로 변환한 뒤에,

pd.DataFrame() 함수를 사용하여 데이터프레임 변환합니다.

df.to_csv() 함수를 사용하면 데이터프레임 구조의 정보를 csv 파일 형태로 저장할 수 있습니다.

pd.read_csv() 함수를 사용하면 저장된 csv 파일 내용을 확인할 수 있습니다.

728x90
728x90

메타코드 강의

"웹 크롤링 기초 강의ㅣ뉴스, 기차 예매, 여행 사이트 실습"

https://mcode.co.kr/video/list2?viewMode=view&idx=92

 

각각의 뉴스에서 정보 수집

KBS 뉴스탭에서 전체 카테고리를 선택하고 일자별 뉴스 항목에 접근합니다.
먼저, 한 항목을 선택하여 페이지로 이동합니다. F12 버튼을 통해 개발자 모드에 접근하면 각 element들에 대한 자세한 정보를 얻을 수 있으며 이는 뒤에서 바로 진행할 것입니다.

하나의 요소에서 정보를 수집하는 것으로 시작하여, 추후에 여러 뉴스에서 정보를 수집하는 실습을 진행할 것입니다.

 

개발자 모드 F12를 통한 요소 분석

타이틀 부분은 h4로 싸여 있고 class는 "headline-title"임을 확인할 수 있습니다.
본문 부분은 "detail-body font-size"라는 클래스로 되어있음을 확인할 수 있습니다.
개발자 모드에서 접근한 뒤, 화살표 버튼을 통해 내가 원하는 요소에 대한 정보를 쉽게 얻을 수 있습니다.
< br > 태그는 엔터 기능에 해당합니다.

 

라이브러리 호출

기본적인 라이브러리들을 호출하기 위하여 아래 코드를 실행합니다.

import requests
from bs4 import BeautifulSoup

위에서 호출한 requests 라이브러리를 통하여 url의 텍스트 정보를 가져올 수 있습니다.

url = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7936381'
html_doc = requests.get(url).text
html_doc

url의 정보의 경우 현재 접속한 페이지의 상단에서 "복사"를 통해 가져오도록 합니다.

위에서 가져온 url 정보를 읽을 때에는 뒤에 .text를 통해 읽도록 합니다.

 

class 정보 수집

title1 = soup.find('h4', class_ = 'headline-title')
title1

이 코드를 실행하여 제목 정보를 가져옵니다.
개발자 모드의 정보에서 title의 class가 어떻게 되는지 쉽게 확인할 수 있으며, 복사 붙여넣기를 통해 'headline-title'을 가져옵니다.

개발자 모드의 좌측 상단의 마우스를 통해 해당 요소의 클래스 정보를 쉽게 찾을 수 있으며, 해당 코드 부분에 마우스 부분을 올려 해당 컨텐츠의 코드 부분이 맞는지 한 번 더 확인하도록 합니다.

 

리스트를 통한 여러 뉴스 데이터 크롤링

아래 코드를 통하여 여러 뉴스들을 하나의 리스트로 담고 데이터프레임으로 만든 뒤에 최종적으로는 csv 파일 형태로 저장합니다.

url_list = []
title_list = []
body_list = []

url1 = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7937463'
html_doc1 = requests.get(url1).text
soup1 = BeautifulSoup(html_doc1, 'html.parser')
title1 = soup1.find('h4', class_ = 'headline-title').text
body1 = soup1.find('div', class_='detail-body font-size').text

url_list.append(url1)
title_list.append(title1)
body_list.append(body1)

url2 = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7937458'
html_doc2 = requests.get(url2).text
soup2 = BeautifulSoup(html_doc2, 'html.parser')
title2 = soup2.find('h4', class_ = 'headline-title').text
body2 = soup2.find('div', class_ = 'detail-body font-size').text

url_list.append(url2)
title_list.append(title2)
body_list.append(body2)

data12 = {'뉴스url':url_list, '제목':title_list, '내용': body_list}

df12 = pd.DataFrame(data12)
df12.to_csv('new12_kbs.csv', index = False)
pd.read_csv('./news12_kbs.csv')

 

현재는 2개의 뉴스 정보를 추출하는 것이 목적입니다. 따라서, url1, url2의 변수에 각각의 사이트에서 가져온 url 주소를 입력합니다.

list.append()를 활용하여 url, title, body에 대한 정보를 담은 리스트를 생성합니다..

생성된 리스트를 통해 딕셔너리 구조를 변환한 뒤 데이터프레임 구조로 변환하고 이를 csv 형식으로 저장합니다.

 

위에서 저장한 CSV 파일을 확인합니다.

 

화면에서 볼 수 있듯이 url_list에 두 개의 뉴스를 담았기 때문에,

2개의 행으로 구성된 데이터프레임 구조가 CSV로 잘 저장되었음을 확인할 수 있습니다.

Jupyter lab에서 아래에서 볼 수 있듯이 Pandas 라이브러리를 활용하여 읽어볼 수도 있습니다.

컬럼 정보 또한 잘 설정이 되었는지도 확인합니다.

 

 

728x90
728x90

Box 다루기

  • 기초 단축키
    • 주석 : ctrl + /
    • 라이브 서버 실행 : ALT + L + O
    • HTML 기본 구성 요소 꺼내기 : ! + Enter
 

HTML 코드   

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width : 300px;
            height : 300px;
            border : 15px solid gray;
            padding : 20px;
            background-color: moccasin;
        }
        .bb{
            box-sizing: border-box;
            background-color: skyblue;
        }
    </style>


</head>
<body>
    <div class = 'cb'>
    </div>
        <p>content-box</p>
    <div class = 'bb'>
        <p>border-box</p>
    </div>

</body>
</html>

 

<div></div>에서 전체 컨텐츠에 대한 형식을 지정합니다.

이 경우에는 너비, 높이, 테두리 넓이, padding, 배경색을 지정했습니다.

.bb 클래스에 대해서는 box-sizing을 별로도 border-box로 만들고, 색도 다르게 설정했습니다.

이렇게 꾸미는 과정을 진행하기 위해서는 <head></head> 안에 <style></style>을 만들고 진행합니다.

 

 

 

출력 결과

 

출력 결과는 위와 같습니다.

cb 클래스는 별도의 꾸미는 과정을 진행하지 않아 div의 내용이 그대로 적용되었고, 그 안에 p 태그를 통해 대입한 content-box 텍스트가 삽입되었습니다.

bb 클래스에는 div 외에 새롭게 정의한 내용인 border-box가 적용되었음을 확인할 수 있습니다.

위의 box와 마찬가지로 p 태그를 통해 텍스트를 추가했습니다.

728x90

'HTML 기초' 카테고리의 다른 글

HTML - Table 다루기  (0) 2024.04.14
728x90

KT Aivle School 에이블스쿨 기자단] 1.15(월) ~ 수료

 

호평이 쏟아지는 우리 조 Big Project 작품

 
ZEP 메타버스 환경에서 서로 다른 조 부스를 다니면서 구경을 하고 패들렛에 의견을 남겨주었다.
 
메타버스 환경에서 자기 부스에 사람들을 많이 오도록 하기 위해 다들 바쁘게 움직였다.
 
우리 조는 시간대를 나누어 부스를 지킬 시간을 정하여 부스가 비어있는 없도록 했다.
 

 
주변에 돌아다니는 에이블러들에게 꾸준히 홍보를 했다.
 
우리 조 부스는 입구쪽에 위치해서 새로 오는 사람들에게  홍보를 하기에 유리한 부분이 존재했다.
 

우수기자단 선정

다른 에이블 기자단 글들을 보며, 우수 기자단 선정에 대한 기대감이 줄어들기도 했는데,
 
운이 좋게도 이런 결과를 얻을 수 있어서 에이블 수료식을 기분 좋게 마무리할 수 있었다.
 
갑작스럽게 앞에 나가서 소감을 발표하게 되어 정신이 없었는데,
 
 "블로그를 처음 운영했는데, 기자단을 시작할 때 세웠던 한 달에 최소 3개 이상 글 업로드를 하겠다는 원칙을
 
지키다 보니 이런 결과를 얻을 수 있었다. 꾸준히 노력하면 어떤 형태로든 보상을 받는다는 것을 느낄 수 있었다."
 
라는 내용으로 소감을 말했다.
 

SQL 스터디 모집

에이블스쿨 수료 이후에도 데이터분야에 관심이 있는 에이블러들과 힘께 SQL 스터디를 하며 실력을 늘리고 싶어서, 에이블 단체 톡방에 채팅을 남겼다.
 
다행이도 관심을 가져준 에이블러들이 생각보다 많아서 원활하게 모집을 마무리 할 수 있었고, 마감 이후에도 신청을 하는 인원들이 있어서 우선 대기 인원으로 기록해두고, 결원이 생기면 연락드리기로 했다.
 

직접 만든 SQL 스터디 노션 페이지 중 일부이다.
 
에이블스쿨 기간 동안에 Python 스터디, SQL 스터디를 운영해보며
 
팀즈, zep 메타버스를 활용해보며 각 플랫폼의 장단점을 알 수 있었고,
 
이번에 새로운 SQL 스터디를 운영할 때는 노션 + 팀즈 조합으로 스터디를 운영하기로 계획을 세웠다.

728x90
728x90

KT Aivle School 에이블스쿨 기자단] 1.8(월)~ 1.12(금) 빅프 마무리

 

발표자료 완성

 

 빅프로젝트를 진행하면서 때로는 어려움을 겪기도 했지만 꺾이지 않고 꾸준히 하다보니 결국 마침표를 찍을 수 있었다.

 

그동안 배웠던 기획안 작성, IT 인프라 구성도, Streamlit을 통한 대시보드 제작, Python을 통한 다양한 기능 구현들을 실제로 해보니 난이도는 높았지만 Mini Project를 진행할 때와는 비교가 되지 않을 정도로 성취감을 느낄 수 있었다.

 

프로젝트를 완수하는 데에 있어 매주 진행되었던 그룹코칭이 도움이 되었다고 느낀다.

 

발표를 하면 지적을 받는 일이 대부분이었지만 이 과정을 통해 완성도 있게 프로젝트를 마무리 할 수 있었다고 느낀다.

 

Streamlit을 통한 대시보드 제작

 

대시보드를 제작하는 과정에서는 수업 중에 배운 Streamlit을 활용하였다.

 

Python 환경에서 간단하게 데이터 기반으로 웹 어플리케이션을 제작할 수 있도록 하는 라이브러리이다.

 

인공지능 모델, Python을 통해 구현한 함수를 통해 동적으로 반응하는 대시보드를 제작하고 이에 대해 시연 영상을 찍으며 머릿 속에 생각하던 아이디어를 구현했다는 것에 뿌듯함을 느꼈다.

 

활용 데이터

 

데이터 분석 및 전처리를 담당하며 공공포털들을 돌아다니며 데이터를 수집하고 가공하다 보니 이정도 양의 데이터가 쌓이게 되었다.

 

데이터를 다루면서 어렵게 느껴졌던 부분은 데이터마다 excel, csv 등 형식이 달랐고 담고 있는 내용도 조금씩 달랐기 때문에 데이터를 통합하는 과정에서 데이터 간에 공통된 요소를 찾고 이 중에서 필요한 부분을 선택하는 과정에 시간이 소요되었다.

 

csv 파일이더라도 파일마다 인코딩 형식이 다른 경우도 존재했다. 또한, 파일 형태가 아닌 API를 통해 정보가 제공되는 경우에도 시간 소요가 발생했다.

 

KT 빅프로젝트 관리 시스템

 

그동안 Teams를 통해 조별모임, 그룹코칭, 과제 제출 및 공지사항들을 안내받았다.

 

이러한 관리 시스템을 통해 체계적으로 과제들을 수행할 수 있었다고 생각한다.

 

앞으로 어떤 과업을 수행하게 된다면 빅프로젝트 과정에서 했듯이 계획을 확실하게 세우고 이를 진행시키려고 한다.

 

빅프로젝트 발표 일정

 

빅프로젝트의 발표는 15일에 사전점검을 마친 이후에 16일부터 진행될 예정이다.

 

빅프로젝트 발표회의 경우 "ZEP" 메타버스 환경에서 진행된다.

 

팀마다 부스를 부여받고, 캐릭터를 통해 이동하면서 다른 팀의 부스에 방문하여 작품들을 구경하고 에이블러들과 소통하는 시스템이다.

 

지금까지 해보지 못한 방식의 발표 진행방식이라 이 부분에 흥미가 생겼고, 어떻게 부스를 운영해야 할 것인지도 생각할 필요성을 느꼈다.

728x90
728x90

SQL GROUP BY] 년, 월, 성별 별 상품 구매 회원 수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131532

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

-- 코드를 입력하세요
SELECT DATE_FORMAT(O.SALES_DATE, '%Y') as YEAR, DATE_FORMAT(O.SALES_DATE, '%m') as MONTH,
        GENDER, COUNT(DISTINCT(U.USER_ID)) as USERS
FROM USER_INFO U
INNER JOIN ONLINE_SALE O on U.USER_ID = O.USER_ID
WHERE GENDER IS NOT NULL 
GROUP BY YEAR, MONTH, U.GENDER
ORDER BY YEAR, MONTH, U.GENDER

 

728x90
728x90

SQL String, Date] 오랜 기간 보호한 동물(2)

https://school.programmers.co.kr/learn/courses/30/lessons/59411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

-- 코드를 입력하세요
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
INNER JOIN ANIMAL_OUTS O on I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC
LIMIT 2

728x90
728x90

SQL String, Date] 취소되지 않은 진료 예약 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/157342

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

-- 코드를 입력하세요

# "1월 2일" - "1월 1일"인 경우 1일이 아닌 2일로 계산해야 한다.

SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1),1) as AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE)+1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

728x90

+ Recent posts