본문 바로가기

Major Study/25-1 Web Crawling

[Web Crawling] find

from bs4 import BeautifulSoup
html = """
<html>
    <head><title class="c">test site</title></head>
    <body>
        <p>test1</p>
        <p class="c" id="pp">test2</p>
        <p class="d">test3</p>
        <p class="e">test4</p>
        <a>a tag</a>
        <b>b tag</b>
    </body>
</html>"""
soup = BeautifulSoup(html, 'lxml')

 

.find()

태그 이름을 이용하여 태그 찾기

print(soup.find("p")) # soup.p
print(soup.find("q"))
print(soup.find(["p","a"])) # p 또는 a 태그 찾기

>>> <p>test1</p>
>>> None
>>> <p>test1</p>

 

태그 속성을 이용한 태그 찾기

soup.find("p", class_="a")
soup.find("p",{"class":"a"})

 

<p> aaa </p>

<p class="a"> bbb </p>

<p class="b"> ccc </p>

 

- 찾고자 하는 태그 이름 후, 찾고자 하는 class 태그속성을 입력한다.

- class 대신 class_를 사용해야 한다.

- p 태그 중에서 class 태그속성값이 "a"인 첫 번째 태그를 찾아준다.

# class 태그속성 값이 "c"인 p 태그 찾기
print(soup.find("p",class_="c"))
print(soup.find("p",{"class"="c"))

# class 태그속성 값이 "c"인 태그 찾기
print(soup.find(class_="c"))

# id 태그속성 값이 "pp"인 p 태그 찾기
print(soup.find("P", id="pp"))

>>> <p class="c" id="pp">test2</p>
>>> <p class="c" id="pp">test2</p>
>>> <title class="c">test site</title>
>>> <p class="c" id="pp">test2</p>

.find_all()

찾은 태그들을 리스트로 리턴한다.

print(soup.find_all("p"))
print(soup.find_all("title"))
print(soup.find_all("xxx"))

>>> [<p>test1</p>, <p class="c" id="pp">test2</p>, <p class="d">test3</p>, <p class="e">test4</p>]
>>> [<title class="c">test site</title>]
>>> []
p_tags = soup.find_all("p")

for tag in p_tags :
	print(tag)

>>> <p>test1</p>
>>> <p class="c" id="pp">test2</p>
>>> <p class="d">test3</p>
>>> <p class="e">test4</p>

 

"c" 또는 "d" class 태그속성을 가지고 있는 p 태그 출력하기

for tag in soup.find_all("p", class_=["c","d"]) :
	print(tag)
    
>>> <p class="c" id="pp">test2</p>
>>> <p class="d">test3</p>

 

HTML 태그 class 속성

클래스가 여러 개인 태그

- HTML 태그는 class 속성에 여러 개의 클래스 이름을 가질 수 있다.

 

- 이 <div> 태그는 "box", "content", "highlight" 라는 3개의 클래스를 가지고 있다.

 

두 클래스를 모두 가진 태그 찾기

from bs4 import BeautifulSoup

html = '''
<div class="box content">Box Content</div>
<div class="box">Just Box</div>
<div class="highlight"> Highlighted </div>
<div class="box highlight"> Box Highlighted</div>
<div class="box content highlight">Full Match</div>
'''

soup = BeautifulSoup(html, 'lxml')

# 'box', 'highlight' 두 클래스를 모두 가진 div 태그 찾기
tags = soup.find_all('div')

for tag in tags :
	if 'box' in tag.get('class') and 'highlight' in tag.get('class') :
		print(tag)
        
>>> <div class="box highlight"> Box Highlighted</div>
>>> <div class="box content highlight">Full Match</div>

 

.find_all()

특정한 태그속성이 있는 태그들 찾기

- 태그속성 = True/False

# body 안에 있는 id 태그속성을 가진 태그들 찾기
print(soup.body.find_all(id=True))

# body 안에 있는 id 태그속성을 가지지 않은 태그들 찾기
print(soup.body.find_all(id=False))

>>> [<p class="c" id="pp">test2</p>]
>>> [<p>test1</p>, <p class="d">test3</p>, <p class="e">test4</p>, <a>a tag</a>, <b>b tag</b>]

 

태그 텍스트가 특정한 값을 가지는 태그들을 찾기

print(soup.find_all('p',text="test1"))
print(soup.find_all('p',text="test2"))
>>> [<p>test1</p>]
>>> []

 

최대한으로 찾을 태그의 수 지정

print(soup.find_all('p', limit=1))
print(soup.find_all('p', limit=3))

>>> [<p>test1</p>]
>>> [<p>test1</p>, <p class="c" id="pp">test2</p>, <p class="d">test3</p>]

.find_all()의 결과

'bs4.element.ResultSet'

- 리스트처럼 사용할 수 있다.

p_tags = soup.find_all('p')
print(p_tags)
print(type(p_tags))

>>> [<p>test1</p>, <p class="c" id="pp">test2</p>, <p class="d">test3</p>, <p class="e">test4</p>]
>>> <class 'bs4.element.ResultSet'>

 

.find(), .find_all() 함수는 태그 뒤에도 사용 가능

- BeautifulSoup 객체 뿐만 아니라 태그 객체에서도 사용이 가능하다.

- .find() 함수의 결과에 .find(),.find_all()를 사용할 수 있다.

soup.find('p').find_all('a')

'Major Study > 25-1 Web Crawling' 카테고리의 다른 글

[Web Crawling] DevTools  (1) 2025.05.18
[Web Crawling] download  (0) 2025.04.18
[Web Crawling] BeautifulSoup  (0) 2025.04.06
[Web Crawling] HTTP  (1) 2025.03.29