반응형

7. BeautifulSoup 설치와 활용


웹 페이지를 표현하는 html 은 마크업 언어로 

태그, 요소, 속성 등의 구성요소를 이용해 문서 구성을 구조적으로 표현한다.


구조화된 문서는 효율적으로 파싱(탐색)하고 원하는 정보를 찾아낼 수 있고

심지어는 스택이나 큐 등의 자료구조를 이용해서 문서를 이루는 내용들을 일일이 파싱할 것도 없이


파이썬 기본 모듈로 제공되는 HTMLParser를 이용하거나

BeautifulSoup 등의 파이썬 라이브러리를 통해서 더욱 손쉽게 파싱할 수도 있다.


HTMLParser가 파이썬 기본 모듈로 제공되기 때문에 

별도의 설치과정 없이 소스창에서 import HTMLPaser 입력만으로 사용할 수 있지만

실제 코드상에서 사용은 beautifulSoup가 더 수월하므로 이참에 beautifulSoup를 사용해도록 하자.


(패키지 관리 툴 pip와 beautifulSoup 설치와 관련해서는 이 게시물에서 확인.)


VisualStudio에서는 Solution Explorer 창에서 import 한 라이브러리를 확인할 수 있다.

beautifulSoup을 정상 설치하고 소스에서 import bs4를 추가하면 Solution Explorer창에서도 확인할 수 있다.

bs4는 beautifulSoup4를 뜻한다.




자, 그럼 이제 beautifulSoup 라이브러리도 사용할 수 있게 되었고

김소혜 갤러리의 html 소스에서 각 게시물 URL이 어디에 있으며 어떻게 파싱해낼 것인가 

html 소스를 찬찬히 살펴보도록 하자.





크롬 소스보기 기능(인터넷 익스플로러에도 동일한 기능이 있다.)이 여기서 빛을 발한다.

웹 브라우저 화면 표시 영역이나 소스 영역에서 원하는 영역을 선택하면 

그에 해당하는 부분을 두 영역 모두에서 보여준다.


위 그림에서는 브라우저에서 나타내는 226139번 게시물과 

226139번 게시물 제목을 표현하는 소스를 확인할 수 있다.


선택된 소스를 살펴보면 a태그를 사용하고 있다.

html의 a태그는 다른 웹 페이지로의 링크 기능을 하는데

링크하는 웹 페이지의 URL 주소는 href 속성 값으로 설정되어 있다.


즉, 사용자가 a태그로 둘러싸인 226139번 게시물 제목을 클릭했을 때에

웹 브라우저는 a 태그의 href 속성 값으로 설정되어 있는 

[/board/view/?id=kimsohye&no=226139&page=1] URL 주소에 해당하는 웹 페이지를 요청한다.


여기서 우리가 30개의 게시물 제목을 둘러싸고 있는 a 태그와 href 값을 beautifulSoup를 이용해

파싱한다면 일일이 클릭할 것 없이 봇(bot)을 이용해 게시물 내용을 확인할 수 있을 것이다.



8. BeautifulSoup


beautifulSoup 라이브러리에 대해서 알아보자. 

beautifulSoup에 대한 설명과 메소드 사용법에 관해서는 beautifulSoup 공식 문서를 참고하였다.


beautifulSoup는 HTML과 XML 파일에서 데이터를 읽어내는 파이썬 라이브러리로

파서 트리를 탐색, 검색, 수정하는데 간편하고 사용자가 만든 파서와 함께 사용하기 쉽다.

프로그래머들의 작업 시간을 줄여 칼퇴근을 가능케하는데 크게 기여할 것이다.


BeautifulSoup 객체를 생성하는 과정에서 파싱 작업은 완료된다.

생성자의 인수로 파싱할 문서를 전달하면 

파싱 처리 후 결과 데이터를 갖는 BeautifulSoup 객체를 반환할 것이다.


아래 코드에서는 BeautifulSoup 라이브러리를 사용해 문서를 파싱하고 그 결과를 출력하는 과정을 확인할 수 있다.

prettify 함수는 BeautifulSoup 에서 파싱 처리한 파서 트리를 유니코드 형태로 리턴하는 함수이다.



html 문서를 구성하는 요소나 속성 값들을 간단하게 탐색하거나 검색할 수 있다.


예제 코드에서의 find_all('a') 함수는 a 태그를 모두 찾아내 리스트를 반환하고 있으니 

여기다 for ~ in 구문을 이용해 원하는 조건의 요소를 찾을 수도 있겠다.


get_text() 메소드를 이용해 텍스트만 뽑아 낼수도 있다.



위 내용은 BeautifulSoup 공식 문서의 퀵스타트 파트를 참고했다.

퀵스타트 말고도 많은 내용들이 있지만 일단은 7번에서 하려던 일을 생각해보자.

게시물 페이지에 접근할 수 있는 URL을 얻으려했고 그 정보는 a 태그의 href 속성에 들어가 있다고 했다.


예제 코드에서 눈치챘겠지만, find_all 함수를 사용해서 어떻게 할 수 있지 않을까?

find_all 함수를 사용해서 a태그를 출력해보자.


:웹페이지를 요청하고 beautifulSoup 라이브러리를 이용해 파싱한 뒤 a 태그를 찾아 출력.


:UnicodeEncodeError Excpe127번째 a 태그를 출력하던 중에 Exception 발생.


try~catch~ finally 문으로 예외처리를 하지 않았다면 위와 같이 비정상 종료가 발생한다.


UnicodeEncodeError. 

단어 그대로 파이썬 인터프리터가 문자열 처리를 하면서 

비정상적으로 판단되는 문자열 인코딩 시퀀스에서 Exception 을 던진(throw) 경우다.


이번 경우에는 html 파싱 처리중에 '&ndsp;'가 들어가있는 텍스트 때문에 발생한 것일텐데

우리가 원하는 동작을 하는데에는 크게 문제가 없으니 

인터프리터가 Throw 하는 Exception은 catch 해서 적당히 notification 하고

하던 일을 계속해보자.


beautifulSoup 뿐만아니라 다른 외부 라이브러리를 사용하다보면 예외 상황이 빈번히 발생한다.

사용자 코드에서 발생하는 실수는 아닌지 찾아보고 디버깅하는 과정도 매우 중요하지만

이번 경우와 같이 외부 서버와 상호 작용하는 과정에서는 

어디서 잘못된 것인지, 누가 고쳐야하는지 등 디버깅하기가 쉽지가 않다.


앞으로도 원하는 동작과 크게 상관없는 부분이라면 예외처리로 적절히 조치하고 그 다음 단계로 넘어가자.


자, 그래서 정상 동작을 한다면 200개 조금 넘는 a 태그 내용을 모두 확인할 수 있다.



다음에는 여기 a 태그 중에서 어떻게 게시물 url 뽑아 내는지 써야지..




반응형