HTML 코드를 분석
해 주는 Python 라이브러리
.HTML Parser
#beautifulsoup4 라이브러리를 먼저 설치해 준다
%pip install bs4
# www.example.com 사이트를 요청한 후 응답 받아보기
import requests
res = requests.get("http://www.example.com")
res.text
HTML Parser
에게 전달한다.from bs4 import BeautifulSoup
# 첫번째 인자로는 response의 body를 텍스트를 전달.
# BeutifulSoup은 다른 마크업 언어도 파싱해 주기 때문에 어떤 언어를 쓸지를 두 번째 인자로 명시.
soup = BeautifulSoup(res.text, "html.parser")
# 객체 soup의 .prettify()를 활용하면 분석된 HTML을 보기 편하게 반환.
print(soup.prettify())
soup
이라는 HTML Parser
를 통해 Parsing
된 객체를 만들었다.HTML의 특정 부분(찾고자 하는 부분)을 추출
할 수 있게 된다.# title 가져오기
soup.title
# head 가져오기
soup.head
# body 가져오기
soup.body
# 요소 하나 찾기 (찾고자 하는 태그의 이름 중 제일 처음 나오는 하나만 추출)
# find("찾고자 하는 태그 이름")
h1 = soup.find("h1")
# 태그로 감싸진 요소들 찾기
# find와 달리 찾고자 하는 태그의 모든 요소를 추출한다.
# find_all("찾고자 하는 태그 이름")
soup.find_all("p")
# 특정 요소의 태그 이름을 알고 싶을 때
h1.name
# 특정 요소의 태그 내용을 알고 싶을 때
h1.text
간단하고 직관적
이다. 가장 좋지 않은 방법
이기도 하다. 개발자 도구(F12)
를 통해 찾고자 하는 태그의 위치를 파악할 수 있고, 역으로 찾고자 하는 곳을 우 클릭하여 검사
를 누르면 찾고자 하는 태그의 위치를 찾아 준다.어떤 태그를 가지고 와야 하는가
에 대한 고민이 필요하다.tagname
: 태그의 이름.id
: 단 하나의 고유 태그를 가리키는 라벨.class
: 두 개 이상의 유사한 태그가 묶을 때 사용하는 라벨. 같은 스타일이나 이벤트를 적용하기 위해.태그 이름
으로만 검색하는 것은 굉장히 안 좋은 방법이다. class나 id name
과 함께 검색하는 것이 정확한 데이터를 볼 수 있기 때문에 더 좋다.id
혹은 class
로 찾기 위해서는 .find("tagname", id="id name")
, .find("div", "class name")
과 같은 방법으로 찾아 준다.#id로 찾기
soup.find("div", id = "results")
#class 찾기 (class는 id와 달리 class=""라고 따로 지정해 주지 않고 class name을 사용하면 된다.
find_result = soup.find("div", "page-header")
#class의 정보를 더 보기 편하게 하기 위해 strip을 사용해 준다. (여백 제거)
find_result.h1.text.strip()
#output
#'Example web scraping website'
💻실습 정리-2.페이지네이션 된 페이지의 원하는 요소 추출
HTML 내용이 고정
된 웹 사이트. HTML 문서가 완전하게 응답이 된다. 그래서 파싱에 대해 아무런 문제가 되지 않는다.HTML 내용이 변하는
웹 사이트. 응답이 된 후에 HTML이 렌더링 될 때까지의 지연 시간이 존재한다. 그 사이 HTML의 구조가 바뀔 수도 있으며 바로 파싱이 불가할 수도 있다. 즉, 동적인 사이트는 비동기 처리를 하기 때문에 비동기 처리된 후에 상황에 따라서 데이터가 완전하지 않은 경우도 발생할 수 있다.
* 동기 처리: 렌더링 후 데이터 처리를 한다.
* 비동기 처리: 요청에 따른 응답을 기다리지 않는다. 렌더링을 하는 과정에서 데이터 처리가 일어날 수도 있다.
임의로 시간을 지연
한 후 데이터 처리가 끝난 정보를 가지고 온다.웹 브라우저
를 쓰고 이를 파이썬으로 조작
하자.Selenium
은 웹 브라우저를 자동화하는 라이브러리로 해당 라이브러리를 통해 동적인 웹사이트의 데이터를 추출
할 수 있다.Selenium
은 UI
와 상호작용
도 가능하다.1. pip 업그레이드
[notice] A new release of pip available: 22.3.1 -> 23.1
다음과 같은 문구로 업그레이드를 하라는 알림이 떴는데 막상 명령어를 입력하여 업그레이드를 하면 제대로 동작하지 않았다.python -m pip install --upgrade pip
알고 보니 명령어만 입력할 게 아니라 경로까지 입력해 주고 그 뒤에 다음과 같은 명령어가 들어가야 업데이트가 되었다.
내PC의 python경로\python.exe -m pip install --upgrade pip
Successfully installed pip -23.1(업데이트 버전)
이 완료가 되면 마지막으로 버전을 확인해 주는 명령어를 입력하여 업그레이드과 완전히 됐는지 확인해 준다.pip --version #output pip 23.1 from C:\Users\pip위치(python 3.11) 다음과 같이 23.1 버전으로 pip이 업그레이드 된 것을 확인할 수 있다.
2. 사이트를 요청해 응답 받을 때 발생하는 MissingSchema 오류
import requests res = requests.get("www.example.com") res
MissingSchema: Invalid URL 'www.example.com': No scheme supplied. Perhaps you meant https://www.example.com?
www.example.com
의 객체를 가지고 오는 명령어를 입력하였을 때 다음과 같은 오류가 발생하였다.- 이 원인은
https:// 혹은 http://
를 붙이지 않아서 발생하는 오류이다.get
을 사용할 때는 이 부분을 유의하도록 하자.