크롤링을 하기 위해서 필수적으로 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 |