웹/크롤링

[BeautifulSoup] #3 find 함수 사용법

호무비 2022. 2. 16. 22:24
반응형

오늘은 BeautifulSoup에서 제공하는 find 함수 사용법에 관해 알아보도록 하겠습니다.

 

특히 함수 파라미터 부분을 조금 자세히 살펴볼 예정입니다.


함수 소개

 

find 함수는 BeautifulSoup 객체가 가지는 함수 중 하나로 주어진 조건에 해당하는 내용을 찾아주는 기능을 합니다.

 

아직 소개하지 않았지만 BeautifulSoup에는 find_all 함수가 있고, 대부분의 기능은 이 find_all 함수로 수행이 가능합니다. 그렇다면 find 함수는 어디에 필요한 것일까요?

 

find_all 함수는 원하는 태그를 모두 찾아서 리스트 형태로 저장하여 리턴해줍니다. 모든 태그를 다 조사하기 때문에 시간이 조금 오래 소요됩니다.

 

html에는 title과 같이 반드시 하나만 있는 태그도 있는데요, 이런 태그를 찾는데 find_all 함수를 사용하는 것은 비효율적입니다. 이때 사용할 수 있는 것이 find 함수입니다.

 

find 함수는 주어진 조건에 맞는 첫 번째 태그를 리턴합니다. 실제 예제를 살펴보며 더 자세히 알아보겠습니다.

 

다음과 같이 p 태그가 여러 개 있는 html을 크롤링해보겠습니다.

 

<div>
    <p>코로나</p>
    <p>올림픽</p>
    <p>크롤링</p>
</div>

 

find에 태그 이름을 지정해주면 해당 태그를 찾을 수 있습니다. 아래 코드는 p 태그를 찾도록 설정했습니다.

 

beautifulSoup.find("p")

 

아래와 같이 첫 번째 태그 <p>코로나</p>만 가져온 것을 확인할 수 있습니다.

 

 

find_all 함수도 limit를 1로 설정하면 find 함수와 비슷하게 동작합니다. 아래 코드는 바로 위에서 본 것과 같은 기능을 수행합니다.

 

beautifulSoup.find_all("p", limit=1)

 

단, 다음과 같이 fill_all은 리스트 형태로 리턴합니다.

 

 

find 함수의 리턴 값 역시 BeautifulSoup 객체이므로 필요하다면 다음과 같이 연쇄적으로 함수를 사용하여 특정 내용을 찾을 수도 있습니다.

 

beautifulSoup.find("body").find("p")

함수 매개변수 설명

 

find 함수는 다음과 같은 구조로 되어 있습니다.

 

find(name, attrs, recursive, string, **kwargs)

 

name

첫 번째 매개변수인 name은 앞서 살펴봤듯이 찾을 태그의 이름을 의미합니다.

 

beautifulSoup.find("title")

 

attrs

두 번째 매개변수인 attrs는 태그의 속성을 지정하는 것입니다.

 

아래와 같이 id나 class 등의 태그 속성에 따라 내용을 찾을 수 있습니다. 다만, class는 파이썬에서 예약어로 사용하고 있기 때문에 class_를 사용해야 합니다.

 

beautifulSoup.find(id="main")
beautifulSoup.find(class_="center")

 

필요하다면 다음과 같이 True, False의 Boolean 값을 지정하여 해당 속성이 있는 경우, 없는 경우를 구분할 수도 있습니다.

 

beautifulSoup.find(id=True)

 

다른 방법으로도 속성 지정이 가능합니다. 아래는 속성을 딕셔너리 형태로 전달해준 것입니다. 여기에서는 문자열로 key, value를 설정해주기 때문에 class_로 쓸 이유가 없어 그대로 써주면 됩니다.

 

beautifulSoup.find(attrs={"class":"center"})

 

만약 name 속성으로 검색하고 싶다면 반드시 딕셔너리 형태로 값을 전달해야 합니다. name이 앞서 봤던 함수 매개변수의 이름으로도 쓰이기 때문입니다. 다음과 같이 지정해주면 됩니다.

 

beautifulSoup.find(attrs={"name": "nickname"})

 

recursive

세 번째 매개변수인 recursive는 자신의 자식 태그에서만 찾을지, 아니면 모든 자손 태그에서 찾을지 설정할 수 있습니다. 기본값은 True로 설정되어 있으므로 자신의 자식 태그에서만 찾을 것이라면 아래와 같이 False로 설정해주면 됩니다.

 

beautifulSoup.find("p", recursive=False)

 

아래 코드의 경우 div가 body의 자식 태그이므로 해당 태그를 검사하지만, p 태그가 아니므로 자식 태그에 대해 recursive 하게 다시 find를 수행합니다. 이번에는 자식 태그에 p 태그가 있으므로 해당 태그를 리턴합니다. 위와 같이 False로 설정하게 되면 자식 태그 하위에 있는 자손 태그를 찾지 않으므로 p 태그를 찾지 못해 None을 리턴하게 됩니다.

 

 

string

네 번째 매개변수, string은 태그 대신 특정 문자열을 찾을 때 사용합니다. 그냥 문자열 하나만 전달해서 그것만 찾을 수도 있고, 문자열 리스트로 전달해서 여러 개를 찾을 수도 있습니다.

 

from bs4 import BeautifulSoup

html = """
<div>
    <p>코로나</p>
    <p>올림픽</p>
    <p>크롤링</p>
</div>
"""

if __name__ == "__main__":
    beautifulSoup = BeautifulSoup(html, "html.parser")
    print(beautifulSoup.find(string="크롤링"))
    print(beautifulSoup.find(string=["확진", "올림픽", "코로나"]))

 

아래와 같이 지정한 내용을 잘 찾는 것을 확인할 수 있습니다.

 

 

kwargs

마지막 매개변수인 kwargs는 정해지지 않은 수의 키워드를 처리할 때 사용되는데, 특별히 신경 쓰지 않으셔도 됩니다.

 

find 함수의 파라미터를 살펴보았는데요, 더 자세한 내용이 궁금하다면 아래 링크의 문서를 참고하시기 바랍니다.

 

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find


새롭게 find 함수를 알아보았습니다. 각 파라미터에 관해 자세히 설명해놓은 한글 자료가 없어서 해당 내용에 중점을 두어 작성했는데, 도움이 되었으면 좋겠습니다.

 

다음번에는 직접 find 함수를 활용하여 크롤링하는 예제를 진행해볼 예정입니다.

 

직접 조사해서 작성하는 글이다 보니 일부 정확하지 않은 정보가 포함되어 있을 수 있습니다.

궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~

구독과 좋아요, 환영합니다!

 

반응형