텍스트형태의 데이터에서 원하는 html 요소에 어떻게 접근할 수 있을까?
이를 쉽게 해결할 수 있게 도와주는 라이브러리가 있다.
이는 BeautifulSoup이며, 날 것의 html을 의미있는 객체로 만들어서 사용자가 원하는 데이터를 가져올 수 있게 만들어준다.
BeautifulSoup4 설치
!pip install beautifulsoup4
BeautifulSoup 사용법
import requests
from bs4 import BeautifulSoup
url='https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'
response=requests.get(url)
if(response.status_code==200:
html=response.text
soup=BeautifulSoup(html,'html.parser')
print(soup)
else:
print(response.status_code)
네이버 지식인에 파이썬을 검색한 url이다. 응답코드가 200일때 html을 받아와 soup객체로 변환한다.
네이버 지식인 크롤링 예제
네이버 지식인에 '파이썬'을 검색하면 첫 번째로 나오는 제목을 가져오려면 어떻게 해야할까?
우선, "https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC" 다음 사이트로 이동해 F12버튼을 눌러보자.
요소를 찾기 위해서는 다음과 같은 방식을 따른다.
Ctrl+Shift+C 를 누르면 마우스 커서가 움직이는 곳의 element를 찾게 도와준다. 그 후 클릭을 하면 원하는 html의 element 정보를 오른쪽 창에서 보여준다.
찾은 html에 copy selector 기능을 이용해보자.
*copy X_path를 사용해도 상관없다.
html에 오른쪽 마우스를 클릭후 copy->copy selector를 선택해 준다.
이제 css selector가 복사되었고, 이를 코드에 적용해보자.
import requests
from bs4 import BeautifulSoup
url = 'https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'
response = requests.get(url)
if response.status_code == 200:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
title = soup.select_one('#s_content > div.section > ul > li:nth-child(1) > dl > dt > a')
print(title)
else :
print(response.status_code)
<a class="_nclicks:kin.txt _searchListTitleAnchor" href="https://kin.naver.com/qna/detail.nhn?d1id=8&dirId=80101&docId=362502659&qb=7YyM7J207I2s&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0" target="_blank"><b>파이썬</b>배우기 쉬운곳 찾아요!!</a>
select_one은 하나의 html element를 찾는 함수이다. css selector를 select_one함수의 인자로 넣어준다.
여기서 바로 soup.select_one().get_text()를 한다면 텍스트만 뽑아올 수 있다.