본문 바로가기
[업무 지식]/Crawling

[Beautiful Soup] 이해하기

by 에디터 윤슬 2024. 12. 31.
from bs4 import BeautifulSoup

# 첫 번째 매개변수에 파일 객체를 지정해 BeautifulSoup 객체를 생성합니다.
# BeautisulSoup()에는 파일 이름 또는 URL을 지정할 수 없습니다.
# 두 번째 매개변수에는 파서의 종류를 지정합니다.

>>> with open('full book_list.html') as f:
...		soup = BeautifulSoup(f, 'html.parser')

# BeautifuSoup 생성자에는 HTML 문자열을 전달할 수도 있습니다.
›> soup = BeautifulSoup(""'
... <html>
... <head><title>온라인 과일 가게</title></head>
... <body>
... <h1 id="main">오늘의 과일</h1>
... <ul>
...		<li〉사과</li>
...		<li class="featured"›귤</li>
...		<li>포도</li>
... </ul>
... </body>
... </html>''', 'html.parser')

》 soup.h1 # Soup.h1처럼 태그 이름을 가진 속성으로 h1 요소를 추출할 수 있습니다.
〈h1 id="main">오늘의 과일</h1〉

》 type(soup.h1) # 요소는 Tag 객체입니다.
{class 'bs4.element.Tag'>

》 soup.h1.name # name 속성으로 태그 이름를 추출할 수 있습니다.
'h1'

》 soup.h1.string # Tag 객체의 string 속성으로 요소 바로 아래의 문자열을 추출할 수 있습니다.
'오늘의 과일'

》 type(soup.h1.string) # string 속성은 str을 상속한 Navigablestring 객체입니다.
<class 'bs4.element.NavigableString'>
>>> soup.ul.text # text 속성은 요소 내부의 모든 문자열을 결합해서 문자열을 추출합니다.
'\n사과\n귤\n포도\n'

>>> type(soup.ul.text) # text 속성은 str 객체입니다.
<class 'str'>

>>> soup.h1['id'] # Tag 객체는 딕셔너리처럼 속성를 추출할 수 있습니다.
'main'

>>> soup.h1.get('id') # 딕셔너리처럼 get() 메서드로도 속성을 추출할 수 있습니다.
'main'

>>> soup.h1.attrs # attr 속성으로 모든 속성을 나타내는 딕셔너리 객체를 추출할 수 있습니다.
{'id': 'main'}

>>> soup.h1.parent # parent 속성으로 부모 요소를 추출할 수 있습니다.
<body>
<h1 id="main">오늘의 과일</h1>
<ul>
<li>사과</li>
<li class="featured">귤</li>
<li>포도</li>
</ul>
</body>

>>> soup.li # 여러 개의 요소가 있는 경우 가장 앞의 요소를 추출하게 됩니다.
<li>사과</li>

>>> soup.find_all('li') # find_all() 메서드도 마찬가지입니다.
<li>사과</li>

>>> soup.find_all('li') # find_all() 메서드로 지정한 이름의 요소 리스트를 추출할 수 있습니다.
[<li>사과</li>, <li class="featured">귤</li>, <li>포도(/li>]

# 키워드 매개변수로 class 등의 속성을 지정할 수 있습니다. class는 예약어이므로 class_로 사용한다는 것 을 주의해 주세요.
>>> soup.find_all('li', class_='featured')
[<li class="featured">귤</li>]
>>> soup.find_all(id='main') # 태그 이름을 생략하고 속성만으로 찾을 수도 있습니다.
[<h1 id="main">오늘의 과일</h1>]

》 soup.select("li') # select() 메서드로 CSS 선택자와 일치하는 요소를 추출할 수 있습니다.
[<li>사과(/li>, <li class="featured">귤</li>, <li>포도</li>]
>>> soup.select('li.featured')
[<li class="featured">귤</li>]
>>> soup.select('#main')
[<h1 id="main">오늘의 과일</h1〉]