BeautifulSoup을 이용해서 텍스트를 추출하는 방법은 대표적으로 두 가지가 있습니다. 하나는 get_text() 이용하는 것이고, 다른 하나는 string를 이용하는 것입니다. 두 방식의 차이점에 대해서 알아보겠습니다.
예제로 다음과 같은 HTML 문서를 사용하겠습니다.
<div class="item_price">
<div class="o-price">
<span><27,000원</span>
</div>
<div class="s-price">
<strong><span>12,900원</span></strong>
</div>
</div>
soup 객체로 저장하겠습니다.
from bs4 import BeautifulSoup
html = \
"""
<div class="item_price">
<div class="o-price">
<span><27,000원</span>
</div>
<div class="s-price">
<strong><span>12,900원</span></strong>
</div>
</div>
"""
soup = BeautifulSoup(html)
이제 위의 HTML 문서에서 할인 가격 12,900원을 추출해보겠습니다.
get_text()
get_text()를 이용하면 한방에 현재 HTML 문서의 모든 텍스트를 추출할 수 있습니다. 조금 더 정확히 표현하면 get_text() 메서드는 현재 태그를 포함하여 모든 하위 태그를 제거하고 유니코드 텍스트만 들어있는 문자열을 반환합니다.
soup.select_one('.item_price').get_text()
# >>> '\n\n<27,000원\n\n\n12,900원\n\n'
태그가 모두 사라지고 텍스트만 남은것을 볼 수 있습니다. 이제 12,900원만 추출하면 됩니다. 하지만 이렇게 생긴 텍스트 묶음에서 원하는 텍스트를 추출하는 것은 번거로운 일이기 때문에, 태그 선택부터 다시 하겠습니다.
get_text() 메서드는 항상 마지막 태그에 사용해야 합니다.
soup.select_one('.item_price > .s-price span').get_text()
# >>> '12,900원'
string
get_text()를 사용하더라도 정확하게 문자열을 추출하기 위해서는 항상 마지막 태그에 메서드를 사용해야 합니다. 개인적으로 애초에 더 명확하게 사용해야 하는 string 속성을 이용해서 문자열을 추출하는 것을 선호합니다.
string 속성은
- 태그(tag) 내 문자열을 반환합니다.
soup.select_one('.s-price > strong > span').string
# >>> '12,900원'
- 태그(tag) 내 자식 태그가 둘 이상이면, 무엇을 반환해야 하는지 명확하지 않기 때문에 None을 반환합니다.
soup.select_one('.s-price').string
# >>> None
- 단 자식 태그가 하나이면서, 그 자식 태그가 .string 값을 가지고 있다면 자식 태그의 문자열을 반환합니다.
soup.select_one('.s-price > strong').string
# >>> '12,900원'
-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.