Python/crawling

BeautifulSoup select

arvigoes 2020. 11. 29. 01:07

크롤링을 하기 위해서 필수적으로 BeautifulSoup 을 사용하게 됩니다.

Request 에 대해서 엄청난 양의 Response 를 보게 되면 사용 할 수 밖에 없는 듯 합니다.

더 좋은게 있다면 그걸 사용하겠지만 지식 수준이 짧아서 이만한게 없네요

 

select 는 이 response 에서 내가 필요로 하는 부분을 검색 하게 해 주는 함수 입니다.

select 에는 select 와 select_one 두가지가 있습니다.

select_one 은 조건에 맞는 최초의 한개의 결과만 가져 오는 것이고,

select 는 조건에 해당하는 전부를 가져 옵니다.

 

 

# select & select_one 사용법

from bs4 import BeautifulSoup

r = requests.get("크롤링 웹 페이지 주소")
soup = BeautifulSoup(r.text, 'html.parser')

#table class ="board_list_table"

board = soup.select_one('.board_list_table')
items = soup.select('.table_body')

 

select 의 결과로 리턴되는 것은 bs4.element.ResultSet 이고,

select_one 의 결과로 리턴 되는 것은 bs4.element.Tag 입니다.

간단하게 설명하면 bs4.element.ResultSet 은 bs4.element.Tag 의 list 라고 생각 하시고 사용 하시면 됩니다.

select 의 결과가 한개라도 ResultSet 으로 결과가 나오는것 잊지 마세요

 

그리고 bs4.element.Tag 객체도 bs4.BeautifulSoup 객체 처럼 사용이 가능 합니다.

 

board.select('.classname')
for item in items :
	item.select_one('tag')

이런식으로 select 의 결과내에서 다시 검색 할 수 있습니다.

긴 텍스트에서 한번에 원하는 것을 찾기 보다는 이렇게 쪼개가면서 검색하는 것도 하나의 방법 입니다.

 

​select 로 검색 가능한 조건

soup.select('tag_name')
soup.select('.class_name')
soup.select('#id_name')                  # id 는 단일로만 사용가능(부모자식관계 사용못함) tag는 가능
soup.select('tag_name.class_name')
soup.select('tag_name[attr1=value1]')

soup.select('parent_tag1 > parent_tag2 > child_tag')    # tag 관계가 직속 일때 > 사용
soup.select('parent_tag.class_name > child_tag.class_name')
soup.select('parent_tag.class_name child_tag')          # tag 관계가 자식의 자식의 ... 일때는 띄어쓰기
soup.select('#id_name > tag_name.class_name)

간단한 html 문서를 통해 사용 예를 보도록 하겠습니다.

html = '''
<html> 
    <head> 
    </head> 
    <body> 
        <h1> 게시판  
            <p id='item' class='title'> 1번 게시글
                <span class = 'number'> 1 </span> 
                <span class = 'desc'> 첫줄 내용 </span> 
                <span class = 'like'> 0 </span> 
                <a href = 'http://board.address.1'> url </a> 
            </p> 

            <p id='item' class='title'> 2번 게시글
                <span class = 'number'> 2 </span> 
                <span class = 'desc'> 첫줄 내용 222 </span> 
                <span class = 'like'> 0 </span> 
                <a href = 'http://board.address.3'> url </a> 
            </p> 
            <p id='item' class='title'> 3번 게시글
                <span class = 'number'> 3 </span> 
                <span class = 'desc'> 첫줄 내용 333 </span> 
                <span class = 'like'> 0 </span> 
                <a href = 'http://board.address.3'> url </a> 
            </p> 
        </h1> 
    </body> 
</html>
'''

 

spans = soup.select('span') 으로 검색시 

                <span class = 'number'> 1 </span> 
                <span class = 'desc'> 첫줄 내용 </span> 
                <span class = 'like'> 0 </span> 

                <span class = 'number'> 2 </span> 
                <span class = 'desc'> 첫줄 내용 222 </span> 
                <span class = 'like'> 0 </span> 

                <span class = 'number'> 3 </span> 
                <span class = 'desc'> 첫줄 내용 333 </span> 
                <span class = 'like'> 0 </span> 

총 9개의 결과가 resultSet 으로 spans에 담기게 됩니다.

 

여기에서 desc 내용만 보고싶다면 class 검색으로 하면 됩니다.

여기에는 여러가지 방법이 있습니다.

spans = soup.select('span')

descs = soup.select('body > h1 > p > span.desc')
descs2 = soup.select('span.desc')
descs3 = spans.select('.desc')
descs4 = soup.select('body span.desc')

descs 들은 모두 같은 결과를 가지므로 적당히 잘 사용하면 될 것 같네요

테그 하위 지정 검색할때 사용하는 > 는 앞 뒤로 띄어쓰기가 필요한 점 참고 하세요

 

속성을 통한 검색도 자주 사용 합니다.

여기에서는 특정 주소를 통한 검색이라 예제가 별로 인데 다양하게 쓸 수 있을듯 합니다.

soup.select('a[href = http://board.addres.1]')

사용법만 숙지하도록 하겠습니다.

검색시 tag 순서를 가져오는 쉬운 방법 입니다.

크롬에서 F12 키를 눌러 원하는 정보를 확인하고 1번을 클릭 -> 원하는 정보클릭(2) -> copy selector 

 

를 통해 "# board_list > div > div.board_main.theme_default.theme_white > table > tbody" 이런 정보를 가져 오는 것도 가능하니 사용에 참고 하세요

 

'Python > crawling' 카테고리의 다른 글

BeautifulSoup Select 의 결과 ResultSet  (0) 2020.12.22
pycharm selenium import  (0) 2020.11.22