Python
크롤링 (Beautiful Soup 라이브러리) - 선택자(selector)
usop
2023. 2. 1. 12:04
css01.html
<html>
<head></head>
<body>
<div id="cartoon">
<h1>좋아하는 만화</h1>
<ul class="elements">
<li>피구왕 통키</li>
<li>미래 소년 코난</li>
<li>로보트 태권 브이</li>
</ul>
</div>
<!------------------------------------------------------->
<ul id="itemlist">
<li id="item1"><a href="hoge.html">피구왕 통키</a></li>
<li id="item2"><a href="https://www.naver.com">그랜다이저</a></li>
<li id="item3"><a href="https://www.daum.net">로보트 태권 V</a></li>
<li id="item4"><a href="http://www.google.com">들장미 소녀 캔디</a></li>
<li id="item5"><a href="http://www.abcd.com">똘이 장군</a></li>
</ul>
<!------------------------------------------------------->
<div id="main-goods">
<h1>과일과 야채</h1>
<ul id="fruits">
<li>감</li>
<li>밤</li>
<li>대추</li>
<li>배</li>
</ul>
<ul id="vegatables">
<li>파프리카</li>
<li class="us">당근</li>
<li class="us">호박</li>
<li class="black" data-lo="us">양파</li>
<li class="cn" id="ko">가지</li>
</ul>
</div>
</body>
</html>
import re
from bs4 import BeautifulSoup
myencoding = 'utf-8'
myparser = 'html.parser'
filename = 'css01.html'
html = open(filename, encoding=myencoding)
soup = BeautifulSoup(html, myparser)
h1 = soup.select_one("div#cartoon > h1").string
print("h1 = ", h1)
li_list = soup.select("div#cartoon > ul.elements > li")
print('type(li_list) :', type(li_list))
for li in li_list :
print("li = ", li.string)
choice = lambda x : print(soup.select_one(x).string)
print('("#item5") : ', end=' ')
choice("#item5")
print('("li#item4") : ', end=' ')
choice("li#item4")
print('("ul > li#item3") : ', end= ' ')
choice("ul > li#item3")
print('("#itemlist #item2") : ', end= ' ')
choice("#itemlist #item2")
print('("#itemlist > #item3") : ', end= ' ')
choice("#itemlist > #item3")
print('("ul#itemlist > li#item2") : ', end= ' ')
choice("ul#itemlist > li#item2")
print('("li[id=item1]") : ', end= ' ')
choice("li[id='item1']")
print('("li:nth-of-type(4)") : ', end=' ')
choice("li:nth-of-type(4)")
# select() 함수는 여러개의 목록을 반환해주는데, 여기에 indexing을 적용할 수 있습니다.
# 1번째 요소와 3번째 요소의 li 태그에 대한 문자열을 출력해보자
print('\nsoup.select("li")[1].string : ', end=' ')
print(soup.select("li")[1].string)
print('\nsoup.find_all("li")[3].string : ', end= ' ')
print(soup.find_all("li")[3].string)
# nth-of-type(su)는 하위 목록에서 n번째 목록을 찾고자 할 때 사용가능하다
# 만약, 해당 값이 없다면 NoneType을 반환한다.
mytag = soup.select_one('div#cartoon > ul.elements')
mystring = mytag.select_one('li:nth-of-type(3)').string
print(mystring)
mytag = soup.select_one('ul#itemlist')
mystring = mytag.select_one('li:nth-of-type(4)').string
print(mystring)
# 속성 값의 일부분을 검색해서 찾기
# 속성찾기 >> ^=' ~으로 시작하는 , '$=' ~으로 끝나는, '*=' ~포함하고 있는
result = soup.select('a[href$=".com"]')
for item in result :
print(item['href'])
result = soup.select('a[href*="daum"]')
for item in result :
print(item['href'])