코딩하는 타코야끼

[스터디 노트] Week6_1일차 [unit1 ~ 13] - EDA(웹데이터) 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week6_1일차 [unit1 ~ 13] - EDA(웹데이터)

가스오부시 2023. 8. 16. 01:51
728x90
반응형

1. Beautiful Soup 기초와 웹데이터

  • 파일로 저장된 html 파일을 읽을 때
  • open : 파일명과 함께 읽기(r) / 쓰기(w) 속성을 지정
  • html.parser : Beautiful Soup의 html을 읽는 엔진 중 하나(lxml도 많이 사용)
  • prettify() : html 출력을 이쁘게 만들어 주는 기능

from bs4 import BeautifulSoup

page = open("../ds_study/unit3/data/03. test_first.html", "r").read()
soup = BeautifulSoup(page, "html.parser")
print(soup.prettify())
>>>
<!DOCTYPE html>
<html>
 <head>
  <title>
   Very Simple HTML Code by PinkWink
  </title>
 </head>
 <body>
  <div>
   <p class="inner-text first-item" id="first">
    Happy PinkWink.
    <a href="http://www.pinkwink.kr" id="pw-link">
     PinkWink
    </a>
   </p>
   <p class="inner-text second-item">
    Happy Data Science.
    <a href="https://www.python.org" id="py-link">
     Python
    </a>
   </p>
  </div>
  <p class="outer-text first-item" id="second">
   <b>
    Data Science is funny.
   </b>
  </p>
  <p class="outer-text">
   <b>
    All I need is Love.
   </b>
  </p>
 </body>
</html>
 

📍 find_all( )

  • 지정된 태그를 모두 찾아준다
soup.find_all("p")
>>>
[<p class="inner-text first-item" id="first">
                 Happy PinkWink.
                 <a href="http://www.pinkwink.kr" id="pw-link">PinkWink</a>
 </p>,
 <p class="inner-text second-item">
                 Happy Data Science.
                 <a href="https://www.python.org" id="py-link">Python</a>
 </p>,
 <p class="outer-text first-item" id="second">
 <b>
                 Data Science is funny.
             </b>
 </p>,
 <p class="outer-text">
 <b>
                 All I need is Love.
             </b>
 </p>]
soup.find_all(class_ = "outer-text")
>>>
[<p class="outer-text first-item" id="second">
 <b>
                 Data Science is funny.
             </b>
 </p>,
 <p class="outer-text">
 <b>
                 All I need is Love.
             </b>
 </p>]

⚡️ 이렇게 사용하는 경우가 많다.

soup.find_all(id = "first")
>>>
soup.find_all(class_ = "outer-text")
1
soup.find_all(class_ = "outer-text")
[<p class="outer-text first-item" id="second">
 <b>
                 Data Science is funny.
             </b>
 </p>,
 <p class="outer-text">
 <b>
                 All I need is Love.
             </b>
 </p>]
# HTML 내에서 속성 id는 딱 한 번만 나타난다
# 그래서 find_all() 함수는 의미가 없다
# 단, 검색결과를 list로 받고 싶다면 id라도 find_all() 함수를 사용한다
soup.find(id = "first")
>>>
<p class="inner-text first-item" id="first">
                Happy PinkWink.
                <a href="http://www.pinkwink.kr" id="pw-link">PinkWink</a>
</p>

📍 응용

for each_tag in soup.find_all("p"):
    print("-"*40)
#     print(each_tag.text) 와 같음
    print(each_tag.get_text())
>>>
----------------------------------------

                Happy PinkWink.
                PinkWink

                Happy PinkWink.
                PinkWink

----------------------------------------

                Happy Data Science.
                Python

                Happy Data Science.
                Python

----------------------------------------

                Data Science is funny.
            

                Data Science is funny.
            

----------------------------------------

                All I need is Love.
            

                All I need is Love.

2. 크롬 개발자 도구 이용하기

from bs4 import BeautifulSoup
from urllib.request import urlopen

# 웹주소(URL)에 접근할 때는 urllib의 request 모듈이 필요하다
url = "<https://finance.naver.com/marketindex/>"
page = urlopen(url)

soup = BeautifulSoup(page, "html.parser")

soup.find_all("span", "value")
>>>
[<span class="value">1,307.50</span>,
 <span class="value">920.48</span>,
 <span class="value">1,437.73</span>,
 <span class="value">181.65</span>,
 <span class="value">142.3400</span>,
 <span class="value">1.1001</span>,
 <span class="value">1.2767</span>,
 <span class="value">101.8300</span>,
 <span class="value">82.82</span>,
 <span class="value">1688.98</span>,
 <span class="value">1976.1</span>,
 <span class="value">81398.14</span>]
soup.find_all("span", "value")[0].string
>>>
'1,307.50'

📍 str 구하기

# 같은 메소드
print(soup.find_all("span", {"class":"value"})[0].text)
print(soup.find_all("span", {"class":"value"})[0].string)
print(soup.find_all("span", {"class":"value"})[0].get_text())
>>>
1,307.50
1,307.50
1,307.50

3. list 데이터형

  • List 형은 대괄호로 생성한다.
  • List 형을 반복문(for)에서 사용하는 방법이 다른 언어에 비해 편하다.
  • in 명령으로 조건문 (if)에 적용하느 것도 역시 다른 명령에 비해 편하다.
if "blue" in colors:
    print(True)
>>>
True

📍list.append( )

  • list 제일 뒤에 하나 추가한다.
movies.append("윈더")
print(movies)
>>>
['그린 북', '가버나움', '디지몬 어드벤처 라스트 에볼루션: 인연', '먼 훗날 우리', '윈더']

📍 list.pop( )

  • list 제일 뒤 자료를 지운다.
movies.pop()
print(movies)
>>>
['그린 북', '가버나움', '디지몬 어드벤처 라스트 에볼루션: 인연', '먼 훗날 우리']

📍 list.extend( )

  • list 제일 뒤 다수의 자료를 추가한다.
movies.extend(["베일리 어겐", "아일라", "당갈"])
print(movies)
>>>
['그린 북', '가버나움', '디지몬 어드벤처 라스트 에볼루션: 인연', '먼 훗날 우리', '베일리 어겐', '아일라', '당갈']

📍 list.remove( )

  • list에서 같은 이름의 자료를 지운다.
movies.remove("가버나움")
print(movies)
>>>
['그린 북', '디지몬 어드벤처 라스트 에볼루션: 인연', '먼 훗날 우리', '베일리 어겐', '아일라', '당갈']

📍 Slicing

  • [n:m] n 번째 부터 m-1까지
movies[2:5]
>>>
['먼 훗날 우리', '베일리 어겐', '아일라']

📍 list.insert( )

  • 원하는 위치에 자료를 삽입한다.
movies.insert(2, 1000)
print(movies)
>>>
print(movies)
['그린 북', '디지몬 어드벤처 라스트 에볼루션: 인연', 1000, '먼 훗날 우리', '베일리 어겐', '아일라', '당갈']

📍list 안에 list를 가질 수 있다.

movies.insert(3, ["비고 모텐슨", "마허샬라 알리", "린다 카델리니"])
print(movies)
>>>
['그린 북', '디지몬 어드벤처 라스트 에볼루션: 인연', 1000, ['비고 모텐슨', '마허샬라 알리', '린다 카델리니'], '먼 훗날 우리', '베일리 어겐', '아일라', '당갈']

📍 instance( )

  • isinstance()는 Python의 내장 함수로, 주어진 객체가 주어진 클래스 또는 데이터 타입의 인스턴스인지를 검사합니다. - 이 함수는 객체의 타입을 확인할 때 유용하게 사용됩니다.
  • object: 타입을 확인하고자 하는 객체.
  • classinfo: 단일 클래스 또는 데이터 타입, 또는 클래스 또는 데이터 타입의 튜플.
isinstance(movies, list)
>>>
True
isinstance(movies, int)
>>>
False# 여러 타입과의 비교 가능
isinstance(movies, (int, list))
# 여러 타입과의 비교 가능
isinstance(movies, (int, list))
>>>
True
  • 결론적으로, isinstance()는 객체의 타입을 안전하게 확인하거나, 객체가 여러 가능한 타입 중 하나에 속하는지 검사할 때 매우 유용합니다.
반응형