[왕초보 웹크롤링 무작정 따라하기] 웹크롤링, BeatifulSoup, 태그 추출, .select(), 텍스트 추출, 문자값 추출, get_text()
#04 웹에서 텍스트 정보 뽑아내기
이전 쳅터에서 BeautifulSoup으로 html을 파싱하고 경로를 파악하는 것까지 해보았다. 이제 select와 get_text 메소드를 사용해서 실제 데이터를 뽑아내보도록 하자.
html에서 문자 데이터 추출하기 select(), get_text()
앞서 파악했던 '프로그램명'들에 대한 경로 'td > p > a'를 select() 괄호 안에 넣으면 경로에 해당하는 데이터가 추출된다. program_names = soup.select('td > p > a')으로 정의해주고 program_names을 출력해 보자.
import requests
from bs4 import BeautifulSoup
response = requests.get("https://search.naver.com/search.naver?where=nexearch&sm=tab_etc&mra=blUw&qvt=0&query=%EC%A3%BC%EA%B0%84%EC%98%88%EB%8A%A5%20%EC%8B%9C%EC%B2%AD%EB%A5%A0")
soup = BeautifulSoup(response.text, 'html.parser')
program_names = soup.select('td>p>a') #지정한 경로의 html을 추출
program_names
코드를 실행해보면 <a>태그에 속하는 데이터들이 [리스트] 안에 나열되고, 그 안에 추출하려는 '프로그램명'이 포함되어 있는 것을 확인할 수 있다. 프로그램명은 <태그>와 </태그> 사이에 위치한 것을 볼 수 있는데 이는 태그에 초함된 별도의 텍스트 요소이기 때문이다. 이러한 텍스트 요소만을 추출하기 위해서는 하나의 메소드가 더 필요한데, get_text()가 사용된다.
하지만 .get_text()는 [리스트] 자료형에서 사용할 수 없다. 때문에 리스트의 각 <a>태그를 하나씩 뽑아서 .get_text()메소드를 적용해야한다. 태그 하나하나 뽑는 코드를 적을 수도 있지만, 이런 반복 작업은특정 조건을 반복하는 for문을 통해 자동화할 수 있다. 각 <a>태그가 나열된 program_names 리스트에서 <a>태그를 하나씩 뽑아서 .get_text()를 실행하는 것이다.
import requests
from bs4 import BeautifulSoup
response = requests.get("https://search.naver.com/search.naver?where=nexearch&sm=tab_etc&mra=blUw&qvt=0&query=%EC%A3%BC%EA%B0%84%EC%98%88%EB%8A%A5%20%EC%8B%9C%EC%B2%AD%EB%A5%A0")
html_data = BeautifulSoup(response.text, 'html.parser')
program_names = html_data.select('td > p > a')
#반복문을 사용해서 각 태그의 텍스트값만 출력
for tag in program_names:
print(tag.get_text())
개발자 도구로 경로 중복 확인 하기
실행해 보면 생각과 다르게 프로그램명 뿐만 아니라 채널명도 함께 출력된 것을 볼 수 있다. html로 돌아가 이유를 찾아보자. '채널'의 html 태그를 확인해 보니 '프로그램명'과 동일하게 <td> 태크 안에 <p> 태그 안에 <a>태그에 위치해 있었다. 즉, '프로그램명'과 '채널'의 경로가 같기 때문에 둘다 추출된 것이다. 이러한 상황을 예방하는 방법으로 개발자도구의 검색을 사용할 수 있다.
개발자도구가 켜진 상태에서 'ctrl+f'를 누르면 검색창이 나오는데, 여기에 찾는 태그를 입력하면 색상으로 표시해 주고 검색창 우측 화살표를 누르면 하나씩 옮겨가며 동일한 태그의 위치를 확인할 수 있다. 경로를 찾다보면 의도치 않게 중복되는 경우가 종종 있으니 종종 활용하게 되는 팁이다. 다음 쳅터에서는 중복된 경로를 필터링하는 방법을 알아보자.
▼다음편 이어보기▼
'데이터 스킬업 > 웹크롤링' 카테고리의 다른 글
[파이썬: 웹크롤링] #06 html/CSS 선택자로 테이터 추출하기 with Select & Find (0) | 2023.03.01 |
---|---|
[파이썬: 웹크롤링] #03 html에서 데이터 출력하기 with BeautifulSoup (0) | 2023.03.01 |
[파이썬: 웹크롤링] #02 requests와 BeatifulSoup 사용해서 html 불러오기 (1) | 2023.02.28 |
[파이썬: 웹크롤링] #01 웹크롤링 입문! 정적/동적 페이지에 대하여 (0) | 2023.02.28 |
[파이썬: 웹크롤링] #00 웹크롤링 사전준비, 파이썬/쥬피터노트북/크롬브라우저 설치부터 실행까지 (1) | 2023.02.28 |
댓글