실제로 크롤링을 처음 시작할 때 헷갈리는 부분 중 하나가 select와 select_one의 차이다.
차이점은 select는 결과값이 리스트 형태로 저장되고, select_one은 그렇지 않다.
select로 수집하였을때는 결론적으로 for문을 통해 한번 더 접근하여야 한다.
아래와 같은 html이 있고, 변수 html에 담는다.
html= """
<html>
<a class="click" href="naver.com"> 네이버링크 </a>
<a class="click1" href="daum.net"> 다음링크 </a>
</html>
"""
1. select를 사용할 경우
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"html.parser")
data = soup.select("a")
print(data)
>> [<a class="click" href="naver.com"> 네이버링크 </a>, <a class="click1" href="daum.net"> 다음링크 </a>]
-->> 리스트에 담긴다.
#여기서 잠깐!
url을 통해 파싱하는 것이 아니기 때문에 requests를 임포트 할 필요는 없다!!
1-1. select_one을 사용할 경우
soup = BeautifulSoup(html,"html.parser")
data = soup.select_one("a")
print(data)
>> <a class="click" href="naver.com"> 네이버링크 </a>
-->> 문서의 처음부터 찾게 되며 가장 첫 <a> 태그를 호출한다.
select_one의 경우 바로 data.text , data ["href"]를 통해 속성 값을 얻을 수 있다.
print(data.text)
print(data["href"])
>> 네이버링크
naver.com
따라서 네이버 링크 텍스트와 주소만 필요하다면 select_one 으로 접근하는 것이 맞다.
만약 다음 링크 텍스트와 주소만 필요하다면 클래스를 추가로 지정하여 바로 접근할 수 있다.
data = soup.select_one("a.click1")
print(data.text)
print(data["href"])
>> 다음링크
daum.net
참고로 모든 텍스트와 링크주소가 필요하다면 아래처럼 하면 된다.
soup = BeautifulSoup(html,"html.parser")
data = soup.select("a")
#리스트 형태로 저장되기 때문에 for문을 통해 개별 요소에 접근해야 한다.
for i in data:
print(i.text)
print(i["href"])
>> 네이버링크
naver.com
다음링크
daum.net
반응형