본문 바로가기
  • 실행력이 모든걸 결정한다
Crawling

[크롤링, 보충] 웹 요소 선택 정리

by 김코더 김주역 2020. 11. 3.
반응형

크롤링 시 웹 요소를 선택할 때 Beautifulsoup, Selenium 모듈을 사용하는 방법이 대표적이다.

두 모듈의 웹 요소 선택 사용법을 설명 하기 전 필수로 알아둬야 하는 개념 하나를 짚고 넘어갈 것이다.

 

CSS에서 tag, class, id를 선언하여 스타일을 설정할 수 있는데, 선언할 때 이 셋을 구별하기 위한 선언 규칙이 있다.

 

- tag : 그냥 tag명을 쓰면 된다.

 

tag명 {
   ...
}

 

- class : class명 앞에 .을 붙인다.

 

.class명 {
   ...
}

 

- id : id명 앞에 #을 붙인다.

 

#id명 {
   ...
}

 

사전 지식은 이 정도면 충분하다.

이 CSS문법이 적용되는 메소드가 몇 개 있는데 앞으로 이들은 빨간 표시로 강조 할 것이다.

두 모듈에서 tag, class, id, attribute 를 기준으로, 그리고 하위 요소로 범위를 좁혀나가며 웹 요소를 정확하게 선택하기 위한 방법을 본격적으로 설명할 것이다.

 

 

1. Beautifulsoup

Beautifulsoup에서 웹 요소를 선택하기 위한 메소드 select_one, select, find, find_all을 소개하겠다.

findAll도 있긴 한데, find_all과는 Beautifulsoup 버전의 차이이다.

결론부터 말하면 findAll 말고 find_all 을 쓰자. 네이밍을 소문자로 하기 위해 Beautifulsoup4 버전에서는 find_all을 쓰기로 했다고 한다.

 

select, find_all은 요소를 리스트 형태로 반환하고

select_one, find는 하나의 요소만 반환하되, 중복이 있을 경우에는 가장 먼저 찾은 요소를 반환하는 것이 원칙이다.

(select_one, select는 CSS문법을 사용한다. 앞서 CSS 선언 규칙을 설명한 것은 select를 설명하기 위함이다)

 

select와 find(find_all) 둘 중 하나를 써야 한다고 했을 때 본인은 주저 없이 select를 고를 것이다.

find는 하위 요소로 범위를 좁혀 나갈 때 반복적으로 메소드를 작성해야 하는데,

ex) soup.find('li').find('p').find('a')

select는 이를 한 문자열으로 쓸 수 있기 때문에 더 직관적이며, 수행시간과 메모리 소모량 모두 우수하다.

ex) soup.select('li p a')

 

1) find(find_all로 해도 인자는 동일)

tag로 찾기 : find('태그명')

class로 찾기 : find('태그명', class_='class명') [파이썬에서 class는 예약어 이기 때문에 뒤에 _를 붙임]

id로 찾기 : find('태그명', id='id명')

속성명으로 찾기 : find('태그명', {'속성명':'속성값'})

참고로 두 인자 중 하나만 써도 잘 동작한다.

 

2) select_one(select로 해도 인자는 동일)

select 메소드는 문자열 형태인 하나의 인자로 요소를 선택할 수 있다고 앞서 언급하였다.

하위 요소는 띄어 쓰기 ' ' 를 경계로, 직계 하위 요소는 ' > '를 경계로 작성하면 된다. >도 양옆에 한칸씩 띄어야 한다.

ex1) <div> 태그 안에 있는 <a> 태그 찾기 : select_one('div a')

ex2) <div> 태그 안에 있는 id명이 'kim' 인 요소 찾기 : select_one('div #kim')

ex3) <div> 태그 이면서, id명이 'kim' 인 요소 찾기 : select_one('div#kim') // 붙여쓰기

ex4) class명이 'coder' 인 요소 찾기 : select_one('.coder')

ex5) <li> 태그 이면서, id명이 'kim' 이면서, class명이 'coder'인 요소 찾기 : select_one('li#kim.coder')

ex6) <p> 태그의 직계 하위 요소인 <a> 태그 찾기 : select_one('p > a')

ex7) 'href' 의 속성값이 "https://www.kimcoder.tistory.com" 인 <a> 태그 찾기 : select_one('a[href=https://www.kimcoder.tistory.com]')

 

find_all 이나 select 메소드를 이용해서 찾은 요소를 모은 리스트 명을 check라고 했을 때

check[index].text로 태그를 제외한 text부분만 추출할 수 있고

check[index]['속성명'] 혹은 check[index].get('속성명') 으로 넣어준 속성명에 해당하는 속성값을 추출할 수도 있다.

 

find나 select_one 메소드를 이용하여 하나의 요소만 check 변수에 담았다면

[index] 만 그대로 빼면 된다. (텍스트 추출: [index].text -> check.text, 속성값 추출도 동일)

 

 

2. Selenium

webdriver 객체에도 웹 요소를 선택할 수 있는 메소드가 있다.

1) find_element_by_id : id로 요소 검색

2) find_element_by_name : name 속성으로 요소 검색

3) find_element_by_xpath : xpath로 요소 검색

4) find_element_by_link_text : 링크 주소로 요소 검색, 대표적으로 <a> 태그에 대해 사용함

5) find_element_by_partial_link_text : 링크 주소의 일부로 요소 검색, 하위 디렉토리 문서까지 모두 검색하기 위한 용도

6) find_element_by_tag_name : 태그로 요소 검색

7) find_element_by_class_name : 클래스로 요소 검색

8) find_element_by_css_selector : 이 메소드는 CSS문법을 사용한다.

 

찾은 요소들의 text, 속성값 추출법은 Beautifulsoup과 동일하다.

 

조금 더 보충이 필요한 사항이 있다면 댓글로 남겨도 좋다.

반응형

댓글