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 태그의 필수 속성으로 이밎를 대체할 수 있는 내용을 텍스르로 삽입
절대경로
는 root(/)에서부터 시작되는 위치를 지정하는 것. 보통 다른 사람의 문서나 파일을 이용할 때 사용하며, 어느 곳에서든 경로에 접근할 수 있음.상대경로
는 현재 파일의 위치를 기준으로 상대적인 경로를 의미, 내부 구조가 바뀌지 않는다면 주소가 변해도 사용할 수 있으나. 자신의 위치가 바뀌면 안된다는 단점 있음절대 경로는 웹, CDN(콘텐츠 전송 네트워크)를 사용할 때 / 상대경로는 디렉토리 내부에서 모듈을 연결하거나 다른 파일을 import 할 때 활용 참고처
_blank 새로운 웹 브라우저 창으로 오픈.
_self 현재 웹 브라우저 창으로 오픈. (기본값)
_parent 부모 웹 브라우저 창으로 오픈.
_top 웹 브라우저 전체 영역에 오픈.
Beautiful Soup Basic
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()
출력 시 공백을 제거
.append()
제일 뒤에 단일 요소 삽입 가능.extend()
제일 뒤에 다수의 자료 삽입 가능.remove()
같은 이름의 자료를 지움isinstance
list 인지 여부를 boolean으로 확인 가능.
.
.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