BeatutifulSoup을 이용할 때 CSS 선택자를 이용하면 원하는 태그를 손쉽게 찾을 수 있습니다. ID와 CLASS 값이 있는 경우라면 더 쉽습니다. 그런데 사실 태그의 속성에는 아이디와 클래스 이외에도 활용하면 더 도움이 되는 값들이 많이 있습니다. 찾고자 하는 태그의 속성 값을 조회하면 특정 요소를 집어내는 것이 더 명확할 테니까요.
이번 포스팅에서는 select, select_one 메서드에 태그 속성 값을 함께 넣어서 원하는 태그를 찾는 방법을 알아보겠습니다.
예시로 사용할 soup 객체를 만들겠습니다.
from bs4 import BeautifulSoup
html = """
<li class="site">
<a href="http://www.testsite.co.kr/fashion/" class="good-info"></a>
<a href="http://www.testsite.co.kr/food/" class="good-info"></a>
<a href="http://www.testsite.co.kr/contact/" class="good-info"></a>
<a href="http://www.testsite.co.kr/news/1" class="good-info"></a>
<a href="http://www.worldwideweb.co.kr/about/" class="good-info"></a>
<a href="http://www.worldwideweb.co.kr/contact/" class="good-info"></a>
<a href="http://www.worldwideweb.co.kr/news/" class="good-info"></a>
<a href="http://www.fruits.co.kr/apple/"></a>
<a href="http://www.fruits.co.kr/pear/"></a>
</li>
"""
soup = BeautifulSoup(html)
속성(attribute)의 값이 특정 값과 정확히 일치하는 경우: =
href의 값이 특정 문자(열)와 정확하게 일치하는 태그를 가져오는 코드입니다. 조건에 일치하는 태그는 1개입니다.
equal = soup.select("a[href='http://www.testsite.co.kr/fashion/']")
print(equal)
# [<a class="good-info" href="http://www.testsite.co.kr/fashion/"></a>]
속성(attribute)의 값이 특정 값으로 시작하는 경우: ^=
href의 값이 특정 문자(열)로 시작하는 태그를 가져옵니다. 조건에 일치하는 태그는 4개입니다.
start_with = soup.select("a[href^='http://www.testsite.co.kr/']")
print(start_with)
# [<a class="good-info" href="http://www.testsite.co.kr/fashion/"></a>,
# <a class="good-info" href="http://www.testsite.co.kr/food/"></a>,
# <a class="good-info" href="http://www.testsite.co.kr/contact/"></a>,
# <a class="good-info" href="http://www.testsite.co.kr/news/1"></a>]
속성(attribute)의 값이 특정 값으로 끝나는 경우: $=
href의 값이 특정 문자(열)로 끝나는 태그를 가져옵니다. 조건에 일치하는 태그는 2개입니다.
end_with = soup.select("a[href$='contact/']")
print(end_with)
# [<a class="good-info" href="http://www.testsite.co.kr/contact/"></a>,
# <a class="good-info" href="http://www.worldwideweb.co.kr/contact/"></a>]
속성(attribute)의 값이 특정 값을 포함하는 경우: *=
href의 값이 특정 문자(열)를 포함하는 태그를 가져옵니다. 조건에 일치하는 태그는 2개입니다.
contain = soup.select("a[href*='news']")
print(contain)
# [<a class="good-info" href="http://www.testsite.co.kr/news/1"></a>,
# <a class="good-info" href="http://www.worldwideweb.co.kr/news/"></a>]
박스 제목
class의 값이 특정 문자(열)와 같지 않은 태그를 가져옵니다. 조건에 일치하는 태그는 2개입니다.
not_equal = soup.select("a[class!='good-info']")
print(not_equal)
# [<a href="http://www.fruits.co.kr/apple/"></a>,
# <a href="http://www.fruits.co.kr/pear/"></a>]
- 이 글은 아나콘다(Anaconda3)가 설치된 주피터 노트북에서 작성되었습니다.