4.4. HTML | Beautiful Soup 기초

소리·2023년 10월 8일
0

Beautiful Soup

from bs4 import BeautifulSoup

Beautiful Soup is a Python package for parsing HTML and XML documents.

  • parsing : 구성 성분을 분해하고 원하는 형태로 조립해서 다시 빼내는 것, 웹 상에서 주어진 정보를 내가 원하는 형태로 가공해 서버에 불러오는 것

  • parser : interpreter나 complier의 구성 요소 가운데 하나로 원시 프로그램을 읽어 문장의 구조를 알아내는 파싱을 행하는 프로그램

    : 태그로 되어있는 문서를 해석하는 기능을 가진 파이썬 모듈

원시 프로그램	▷ Parser ▷ 구문을 해석할 수 있는 단위
JSON	▷ Parser	▷ Object
XML		▷ Parser	▷ XML Document
HTML	▷ Parser	▷ Array

🔎 JSON 이란?
Java Script Object Notation
데이터 교환 방식 중 하나, 독립적인 데이터 형태, 교환방식

HTML 기초

<!DOCTYPE html>  # html 태그를 정의하기 전에 가장 먼저 선언되어야 하며, 웹 브라우저가 웹페이지를 html5 문서 임을 인식하게 한다. 


<html>    #HTML 태그는 웹페이지를 표현
	<head> # 눈에 보이지 않지만 문서에 필요한 헤더 정보 보관
    	<body> #눈에 보이는 정보를 보관
        	<p> Hello World</p> 
        </body>
    </head>

</html>
  • 속성

<h1 title='제목속성값'> 소리 블로기 <h1> #제목태그
#제목속성값은 마수르르 가져가면 툴팁으로 표시
#title 속성은 요소에 대한 몇 가지 추가 정보를 제공

<h> 태그는 heading 이라고 하며 <h1> ~ <h6> 까지 있음


<head> #웹페이지 정보/css, java script 파일 등을 연결하는데 사용
>> 내부 태그 : meta (웹페이지 정보작성), title(제목 태그), link(다른 파일을 추가 - css 연결), script(스크립트를 추가하거나 연결), style(스타일시트를 추가), base(기본 경로 지정)

<div> 태그는 Division의 약자로, 레이아웃을 나누는데 주로 쓰인다. 
>>속성 style, width, height, border(테두리 굵기), background-color, float(정렬), margin(여백)
  • 선택자

선택을 해주는 요소, 특정요소를 선택해 스타일을 적용할 수 있다.
id : 어떤 요소에 대한 유일한 특성을 정의한다. HTML문서에서 특정 id 속성값은 오직 하나이다. 스타일을 지정할 때한 가지만 지정해서 쓰는 이름 (표기방식 : #스타일)

class  : 어떤 분류 안에 포함된 요소의 윽성을 정의하는데 사용하고,  여러번 반복될 필요가 있는 스타일은 클래스 선택자를 이용한다. 그룹으로 묶어서 스타일을 지정 (표기방식 : .스타일)
  • 형식 태그

<i> 이탤릭체, 기울임 (단순하게 이태릭체 이용) == <em> : 특정 텍스트에 강조하고 싶을 때
<b> 볼드체 == <stroing> : 동일한 효과이지만 의미적으로 중요할 때 사용
<tt> 타자기 글자 모양
<u> 밑줄
<sub> 아래 첨자
<sup> 윗 첨자
<del> 텍스트 취소선
<mark> 형광펜 형태의 하이라이트 표현
  • 목록 태그

<ol> Ordered List로 번호를 매기는 순서 있는 목록
<ul> Unordered List 순서 없는 목록

각 목록의 아이템은 <li> 태그 사요ㅗㅇ

예) <ul>
		<li> Menu </li>
        <li> Beverage </li>
    </ul>
  • 하이퍼링크

<a href= '' > 바로가기 <a>
#앵커태그로 하이퍼링크를 정의
#href 속성으로 a태그 안에서 이동할 url 지정

<img src = '' alt=''>
#html 내에 이미지를 첨부할 때 사용
#src 속성으로 경로값 표시
#alt 속성은 img 태그의 필수 속성으로 이밎를 대체할 수 있는 내용을 텍스르로 삽입

🔎 절대경로 vs 상대경로

  • 절대경로는 root(/)에서부터 시작되는 위치를 지정하는 것. 보통 다른 사람의 문서나 파일을 이용할 때 사용하며, 어느 곳에서든 경로에 접근할 수 있음.
    예) https://velog.io/@ksolar03, C:\Program Files\Git
  • 상대경로는 현재 파일의 위치를 기준으로 상대적인 경로를 의미, 내부 구조가 바뀌지 않는다면 주소가 변해도 사용할 수 있으나. 자신의 위치가 바뀌면 안된다는 단점 있음
    예) ./src/compnents/Counter.js, ../../img/logo.jpg
    ※ 내컴퓨터 콘텐츠를 연결하기 위해서 로컬 컴퓨터의 절대경로를 사용하면 연결되지 않음
  • 절대 경로는 웹, CDN(콘텐츠 전송 네트워크)를 사용할 때 / 상대경로는 디렉토리 내부에서 모듈을 연결하거나 다른 파일을 import 할 때 활용 참고처

  • TARGET 속성값

_blank 새로운 웹 브라우저 창으로 오픈.
_self 현재 웹 브라우저 창으로 오픈. (기본값)
_parent 부모 웹 브라우저 창으로 오픈.
_top 웹 브라우저 전체 영역에 오픈.

Beautiful Soup Basic

  • 파일로 저장된 html 파일 읽기

from bs4 import BeautifulSsoup

page = open('../data/03.trest_first.html', 'r').read()
soup = BeautifulSoup(page, "html.parser")
print(soup.prettify())

#open : 파일명과 함께 읽기(r) / 쓰기(w) 속성을 지정
#html.parser : 뷰티풀 수프의 html을 읽는 엔진 중 하나 (lxml도 있음)
#prettify() : html 출력을 예쁘게 만드는 기능
--result

<!DCOTYPE doctype html>
<html>
  <head>
   <title>
    Very Simple HTML Code by PinkWink
   </title>

🔎 page 변수에 페이지의 html 정보를 저장
🔎 html.parser 사용하여 html 문법을 바탕으로 웹 페이지의 정보 분류

  • 찾기

1) .find() : 가장 처음 것을 찾는다.
id는 HTML 내 딱 하나이기에 find(id="first")로 사용할 수 있다.

2) .find_all() : 지정한 태그를 모두 찾는다. 결과 값을 list로 반환한다.
예) soup.find_all("p"), soup.find_all(class = "outer_text")

3) .select()

soup.find_all('div', 'sammy'), len(soup.find_all('div, 'sammy'))

#동일한 내용
soup.select(".sammy"), len(soup.select(".sammy"))
  • 문자열 추출

.text() 하위 자식태그의 텍스트까지 문자열로 반환

.get_text() 유니코드 텍스트만 들어있는 문자열을 반환한다. 문자열이 었으면 아무 정보도 출력하지 않음. 가장 태그 마지막에 .get_text()로 사용

.string() .string 태그 하위의 문자열을 객체화 하고, 문자열이 없거나 자식 태그가 둘 이상이면 (무엇을 반환해야 하는지 명확하지 않기에) None 반환 (이게 get_text와 유의미한 차이)

.strip() 출력 시 공백을 제거

  • list

    .append() 제일 뒤에 단일 요소 삽입 가능
    .extend() 제일 뒤에 다수의 자료 삽입 가능
    .remove() 같은 이름의 자료를 지움
    isinstance list 인지 여부를 boolean으로 확인 가능

.
.

Regular Expression(정규 표현식) 기초

  • 특정한 규칙을 가진 문자열의 집합을 표현/검색하는데 사용하는 형식의 언어, 매우 간단한 방식으로 표현할 수 있다.

.x : 임의의 한 문자를 표현 (x가 마지막으로 끝남)
x+ : x를 1번 이상 반복
x? : x가 존재하거나 존재하지 않음
x* : x를 0번 이상 반복
x|y : x 또는 y를 찾음

.
.

예제보기

from bs4 import BeautifulSsoup

from urllib.request import Request, urlopen

url_base = 'https://www.chicagomag.com/'
url_sub = 'Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/'
url = url_base + url_sub

req = Request(url, header={"User-Agent" : "Chrome"}
html = urlopen(req).read()
soup = BeautifulSoup(html, "html.parser")

#텍스트 추철
soup.find(class="sammyRank").get_text()
 # == soup.select_one(".sammyRank").text

soup.find("div", {"class":"sammyListing"}).get_text()
 # == soup.select_one(".sammyListing").text
profile
데이터로 경로를 탐색합니다.

0개의 댓글