크롤링

python 크롤링, select , select_one 차이

개발자J군 2020. 7. 8. 20:16

실제로 크롤링을 처음 시작할 때 헷갈리는 부분 중 하나가 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

 

반응형