본문 바로가기
📁study archive/web-crawling

HTML 분석

by Hush 2022. 6. 16.

HTML분석에 대해 논하기 전에, 짚고 넘어갈 철학이 있다.

개발자의 분석력을 과시하기 전에, 이 페이지의 HTML을 분석하는 것이 최선인지 고민하라.

더 나은 구조를 갖춘 모바일 버전 사이트가 있을 수도 있고,

자바스크립트 파일에 숨겨진 정보가 더 유용할 수도 있다.

페이지 URL에 유용한 정보가 숨겨저 있을때도 있고

아예 다른 웹 사이트를 분석하는 것이 현명한 방법일 수도 있다.

 

BeautifulSoup를 활용하면 태그와 속성값들로 HTML을 분석할 수 있다.

이때 핵심적으로 사용되는 것이 find와 findAll 함수이다.

 

find() , findAll() 함수

BeautifulSoup에서 가장 자주 쓰는 함수이다.

페이지에서 원하는 태그를 필터링하는 기능을 수행한다.

find와 findAll 함수에서 전달할 인자들은 다음 표와 같다.(대부분경우 tag와 attributes만 쓸 것이다)

종류 설명
tag 태그 이름인 문자열을 넘기거나, 태그 이름으로 이루어진 파이썬 리스트를 넘긴다.
ex) bs.findAll('h1') , findAll(['h1','h2'])
attributes 속성으로 이루어진 파이썬 딕셔너리를 받고, 그중 하나에 일치하는 태그를 찾는다.
ex) bs.findAll('span', { 'class' : ['green', 'red']})
recursive 문서에서 얼마나 깊이 찾아 들어가고 싶은지 지정하는 불리언이다.
True면 매개변수에 일치하는 태그를 찾아 자식, 자식의 자식을 검색한다.
False면 문서의 최상위 태그만 찾는다.
기본값은 True이고, 잘 건들이지 않는다.
text 텍스트 콘텐츠로 필터링하는 인자이다. 태그에 둘러싸인 특정 텍스트를 찾을 때 사용한다.
ex)bs.findAll(text='the prince')
limit findAll에서만 쓰는 인자로, 결과를 몇 개 찾을때 까지 필터링을 계속할지 결정합니다.
즉, find함수는 findAll함수의 limit을 1로 설정한 것과 같습니다.
keyword 특정 속성이 포함된 태그를 선택할 때 사용합니다.
attrubutes는 or 필터처럼 동작했지만 keyword 매개변수는 and필터처럼 동작합니다.
class는 파이썬 예약어이므로 class_ 라고 적어주어야 함에 유의해야합니다.
ex) bs.findAll(id='title', class_='text')

 

트리 이동

findAll 함수는 이름과 속성으로 태그를 찾는다.

하지만 이것 만으로 우리가 원하는 요소에 접근하는 것은 쉽지 않을 수 있다.

html 트리 구조 내에서 특정 자식요소, 형제요소, 부모요소에 접근하는 방법에 대해 알아보자.

 

자식/자손 다루기

전 글의 예제에서 보았듯, 온점을 찍고 태그를 적어주면 자손을 선택할 수 있다.

예를 들어 bs.body.h1은 body의 자손인 첫 번째 h1 태그를 선택한다.

마찬가지로 bs.div.findAll("img")는 문서의 첫 번째 div 태그를 찾고, 그 div 태그의 자손인 모든 img 태그의 목록을 가져온다.

 

만약 어떤 태그의 자식만을 다루고 싶다면 .children 을 붙여주면 된다.

예를 들어 bs.table.children은 첫 테이블 태그의 자식들을 list_iterator로 반환한다.

 

형제 다루기

.next_sibling 또는 .next_siblings를 통해 다음 형제 또는 다음 형제들을 가져올 수 있습니다.

next_sibling은 태그 객체를, next_siblings는 generator를 반환합니다.

당연히 태그 객체 자신은 자신의 형제가 아니므로, 자신 다음의 객체 또는 객체들이 선택됩니다.

예를 들어 table 태그에서 제목 열을 제외한 나머지 열들에 접근할 때 활용할 수 있습니다.

 

비슷한 맥락에서, .previous_sibling 또는 .previous_siblings 또한 형제관계에서 사용할 수 있습니다.

 

부모 다루기

아주 가끔, 부모를 찾아야 할 때도 있습니다.

.parent와 .parents를 통해 부모를 찾을 수 있습니다.

parent는 부모 객체를 반환하고 parents는 부모, 부모의 부모, 부모의 부모의 부모, ... 로 구성된 generator를 반환합니다.

'📁study archive > web-crawling' 카테고리의 다른 글

웹 스크레이퍼 입문  (0) 2022.06.09

댓글