본문 바로가기
Python/크롤링, 스크래핑 (Selenium 등등)

[Python] Beautifulsoup 라이브러리 설명과 사용법 beautifulsoup(), find(), find_all(), select(), select_one()

by dong_su 2024. 5. 27.

Beautiful Soup은 HTML 및 XML 문서를 파싱하고 구문 분석하기 위한 파이썬 라이브러리입니다. 이 라이브러리는 웹 스크래핑 및 데이터 추출 작업에 널리 사용됩니다. 주요 기능은 다음과 같습니다:

  1. 파싱(Parsing): Beautiful Soup은 HTML 및 XML 문서를 구문 분석하여 파이썬 객체로 변환합니다. 이를 통해 문서 내에서 데이터를 탐색하고 추출할 수 있습니다.
  2. 데이터 추출: Beautiful Soup은 문서 내에서 특정 태그, 클래스, ID 등을 검색하여 데이터를 추출할 수 있습니다. 이를 통해 웹 페이지에서 텍스트, 링크, 이미지 등 다양한 유형의 데이터를 쉽게 추출할 수 있습니다.
  3. 탐색(Navigation): Beautiful Soup은 문서 내에서 태그 간의 관계를 탐색할 수 있는 기능을 제공합니다. 이를 통해 부모, 자식, 형제 등의 관계를 이용하여 원하는 요소를 찾을 수 있습니다.
  4. 편리한 API: Beautiful Soup은 사용하기 쉬운 API를 제공하여 사용자가 간편하게 데이터를 추출하고 처리할 수 있도록 돕습니다. 각 요소에는 여러 유용한 메서드와 속성이 있어 웹 스크래핑 작업을 더욱 효율적으로 수행할 수 있습니다.
  5. 유연성: Beautiful Soup은 다양한 파서를 지원하며, HTML과 XML 문서를 모두 처리할 수 있습니다. 이러한 유연성은 다양한 웹 사이트에서 데이터를 추출할 때 유용합니다.

Beautiful Soup은 웹 스크래핑 및 데이터 추출에 널리 사용되는 강력하고 유연한 도구로, 웹페이지의 구조를 파악하고 원하는 정보를 추출하는 데 매우 유용합니다.


코드 예시)

# requests의 get함수를 이용해 해당 URL로 부터 HTML이 담긴 자료를 받아옴
response = requests.get(url)    

# HTML을 잘 정리된 형태로 변환
soup = beautifulsoup(response.text, 'html.parser')

# find() : 하나만 찾음 (여러 개일 시 첫 번째만), 해당 요소 없을 시 None 반환
soup.find("태그명", class_="클래스명")
soup.find("태그명", {"id" = "아이디명"})

# find_all() : 모두 다 찾음, 리스트 형태 리턴, 해당 요소 없을 시 빈 배열 반환
soup.find_all("태그명", class_="클래스명")
soup.find_all("태그명", {"id": "아이디명"})

# select() : find_all과 같은 개념, 리스트 형태 리턴, 해당 요소 없을 시 빈 배열 반환
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('태그명[속성1=값1]') # 속성1*=값1도 사용 가능(*은 포함을 의미)

# 텍스트 추출
element = soup.select("태그명")
text = element.get_text() # 태그 내부의 모든 텍스트를 추출
text = element.text # 위와 동일, 태그 내부의 모든 텍스트를 추출

# 원하는 속성 추출
link = element['href']  # attrs["속성명"]과 동일, 존재하지 않으면 KeyError 발생
link = element.get('href')  # 위와 동일, 존재하지 않으면 None 반환
image = element['src']
image = element.get('src')

 

get_text() vs .text

  • get_text(): BeautifulSoup 객체의 메서드로, 해당 태그 내 모든 텍스트를 반환합니다. 여러 줄로 구성된 텍스트를 포함하며, 필요에 따라 여러 옵션을 사용할 수 있습니다.
element.get_text(strip=True)  # 텍스트 양쪽 공백을 제거하고 반환
  • .text: BeautifulSoup 객체의 속성으로, 해당 태그 내 모든 텍스트를 반환합니다. get_text()와 기능적으로 동일하지만, 메서드 호출이 아닌 속성 접근 방식입니다.
text = element.text.strip()  # 텍스트 양쪽 공백을 제거하고 반환

get() vs attrs[]

  • attrs[]: BeautifulSoup 객체의 속성에 직접 접근합니다. 해당 속성이 존재하지 않으면 KeyError를 발생시킵니다.get(): 해당 속성 값을 반환하며, 속성이 존재하지 않으면 None을 반환하거나 기본값을 설정할 수 있습니다.
link = element['href']

 

  • get(): 해당 속성 값을 반환하며, 속성이 존재하지 않으면 None을 반환하거나 기본값을 설정할 수 있습니다.
link = element.get('href')  # 속성이 존재하지 않으면 None 반환
link = element.get('href', 'default_value')  # 기본값 설정