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'])