BeautifulSoup
1 개요편집
스크레이핑을 위한 라이브러리. HTML과 XML의 정보를 추출하기 위한 도구이다.
1.1 방식편집
태그, class, id 같은 속성으로 필요한 데이터에 접근한다.
크롤링은 requests 모듈로도 가능하지만, 코드를 파이썬이 이해하는 구조로 바꾸어주진 못한다. 때문에 사용하는 도구. 데이터는 requests나 다른 모듈로 불러오고, 분석을 BeautifulSoup에서 수행한다.
pip install beautifulsoup4
파서 라이브러리를 골라 사용할 수 있는데 pip install lxml 로 설치해 사용한다.(다양한 파서 종류가 있으니, 적절한 것을 찾아 사용하면 된다.) 파서는 lxml을 많이 사용하는 듯.
2 사용편집
2.1 기본 사용법편집
과정 | 설명 | 방법 |
---|---|---|
url 열기 및 준비 | urllib 등의 라이브러리를 사용해 url 문서를 연다.
뷰티플 스프를 불러오는 과정에 유의하자. (이름이 특이하다) |
from bs4 import BeautifulSoup
from urllib.request
utl = "http://주소..."
data = urllib.request.urlopen(url).read()
text = data.decode("utf-8") # 일반적으로 html로 읽어온다.
|
2.2 html편집
과정 | 설명 | 방법 |
---|---|---|
BeautifulSoup와 연결 | 특정 html 문서를 파서와 연결한다. | 위에서 불러와 text로 정리된 데이터를 BeautifulSoup로 처리한다.
BeautifulSoup 인스턴스 생성.soup = BeautifulSoup(text, "html.parser") # 파서라이브러리를 html.parser로 지정.
|
하위 태그에 접근하기 | 닷 문법으로 하위태그에 접근할 수 있다. | h1 = soup.html.body.h1
h1_text = h1.string # 요소의 글자부분을 추출한다.
|
태그 찾기 | 웹페이지에선 수많은 태그가 쓰여, 위의 방법으로 찾은 건 솔직히 무리;
때문에 id나 class를 지정하여 검색한다.
|
내용 = soup.find('찾을태그', class_='찾을클래스')
find_all()은 결과를 리스트로 반환한다.
|
하위 속성에 접근 | 닷 문법으로 하위태그에 접근할 수 있다. | 내용.a # 찾은 내용 안의 a태그에 접근한다.
|
태그 내부에 접근 | 태그 안에서도 많은 정보들을 품고 있다.
태그 내의 속성들은 태그.attrs 안에 사전으로 담겨있다. |
태그를 찾은 후...a = soup.html.body.태그
a_text = a.string # 태그 내부의의 글자부분을 추출한다.
a_href = a.attrs['href'] # 태그 안의 속성(attributes )을 지정해 접근한다.
|
CSS선택자 찾기 | CSS나 자바스크립트의 선택자를 통해 찾을 수도 있다.
HTML 태그나 속성으로 찾는 것보다 더욱 다채로운 조건으로 찾을 수 있다. (내용을 어떻게 기입해 넣어야겠는지는 모르겠네;;) |
태그 = soup.select_one("")
select()은 결과를 리스트로 반환한다.
|
정규표현식과 조합 | BeautifulSoup의 기능.
re를 임포트하여 정규표현식과 함께 사용할 수 있다. |
정규표현식으로 컴파일한 값을 이용해 find를 사용할 수 있다.from bs4 import BeautifulSoup
import re # 정규표현식을 사용할 때 사용하는 라이브러리.
...
list = soup.find_all(href=re.compile(r"^http://")) # href 속성이 http://로 시작하는 것들을 찾는다.
|
2.3 find사용편집
찾은 것에 또다시 find를 중복으로 적용할 수도 있다.
attrs = {"속성1":값, "속성2":값2, ...} # 속성에 대해 검색할 땐 사전에 담아 처리하면 편리.
soup.find(id=:"id이름").find("태그", attrs).string # find를 중복 적용할 수도 있다.
# 태그 안의 속성에도 접근할 수 있다.
2.4 CSS선택자편집
2.4.1 select 기초사용편집
soup.select("#id > 태그명.클래스명) # 해당 아이디 안의, 태그 안의, 클래스 명까지 일치하는 것들을 찾아낸다.
2.4.2 CSS선택자편집
다음의 내용을 select 안에 넣어준다.
의도 | 설명 | 방법 |
---|---|---|
모두 선택 | * | |
요소이름으로 선택 | 요소 | |
클래스이름으로 | .클래스 | |
id로 | #id |
2.4.3 관계편집
의도 | 설명 | 방법 |
---|---|---|
여러 선택자 선택 | 선택자, 선택자 | |
선택자 후손 선택 | ??후손과 자손의 차이가 뭘까;;?
후손선택자 모두 선택. |
선택자 후손선택자 |
선택자 자손 선택 | 자손선택자 모두 선택. | 선택자 > 자손선택자 |
범위지정 | 선택자 사이의 요소들올 모두 선택한다. | 선택자1 ~ 선택자2 |
이외 다른 방법들은 필요할 때 찾아다 쓰고 여기에 추가하자.
2.5 절차편집
soup = BeautifulSoup(html, "html.parser") # 뷰티플스프 객체.
soup.prettify() # 분석이 제대로 됬는지 확인.(내용이 print된다.)
a = soup.html.body.a # a태그를 변수에 할당.
'herf' in a.attrs # 해당 태그 안에 herf 속성이 있는지 True, False로 반환받는다.