Python은 다양한 HTML 파서 덕분에 웹 스크래핑에 널리 사용됩니다. 본 글에서는 가장 널리 쓰이는 파서인 Beautiful Soup, HTMLParser, lxml, PyQuery, Scrapy를 살펴보겠습니다. 이 파서들은 사용 편의성, 속도, 최신 HTML 표준 지원, 문서화, 커뮤니티 지원으로 선호됩니다.
바로 시작해 보겠습니다!
Beautiful Soup
Beautiful Soup은 HTML 및 XML 문서를 파싱하기 위한 Python 라이브러리입니다. 각 페이지의 구조를 반영하는 파싱 트리를 생성하여 데이터를 자동으로 추출하기 쉽게 합니다. 이 트리는 문서 내 요소들의 계층 구조를 나타내므로, 특정 노드를 찾기 위해 효율적으로 탐색하고 검색할 수 있습니다.
기능 및 사용 편의성
Beautiful Soup은 HTML 문서를 구조화된 정보로 정리하는 데 유용합니다. html.parser, lxml, html5lib 등 다양한 파서를 제공하여 표준 HTML, 잘못된 형식이나 손상된 HTML, XHTML, HTML5, XML 등 다양한 마크업 유형을 처리할 수 있습니다. 이를 통해 속도와 정확성 사이에서 최적의 균형을 선택할 수 있는 유연성을 제공합니다. 예를 들어, 태그가 누락되었거나 요소가 잘못 중첩된 웹 페이지를 처리할 때는 html5lib를 사용하여 웹 브라우저와 동일한 방식으로 HTML 콘텐츠를 파싱할 수 있습니다.
HTML 구조가 예측 불가능하거나 체계적이지 않은 웹 스크래핑 작업에는 Beautiful Soup이 유용합니다. 문서가 파싱되면 트리를 쉽게 검색하여 노드를 찾을 수 있습니다. find(), find_all(), select() 와 같은 검색 메서드는 식별자, 클래스, 텍스트 콘텐츠 또는 속성을 기반으로 요소에 접근하는 방법을 제공합니다. 태그의 모든 인스턴스를 찾거나 특정 요소를 대상으로 하는 경우, 올바른 선택기를 사용하면 최소한의 코딩 노력으로 필요한 데이터에 빠르게 접근할 수 있습니다.
속도
Beautiful Soup은 가장 빠른 파서는 아니지만, 유연한 파싱 전략을 제공하여 적응성을 부여합니다. 기본적으로 Python의 html.parser를 사용하며, 이는 블로그 게시물에서 데이터를 추출하는 것과 같은 간단한 작업이나 소규모 문서 작업에 가장 적합합니다. 대량의 데이터를 스크래핑하고 처리하려면 다른 파서를 사용하는 것을 고려하십시오.
최신 HTML 표준 지원
정적 웹 페이지의 HTML5 요소 및 속성을 분석하려는 경우 Beautiful Soup이 탁월한 선택입니다. 최신 HTML 표준 준수를 보장하는 파서와의 호환성을 갖추고 있습니다.
문서화 및 지원
Beautiful Soup은 방대한 문서를 보유하고 있으며 GitHub에서 85만 명 이상의 사용자가 활용하고 있습니다. 문서에는 예제, 튜토리얼, 참조 자료가 포함되어 있어 쉽게 시작할 수 있습니다.
Beautiful Soup을 활용한 웹 스크래핑에 대해 자세히 알아보세요 .
코드 예시
Beautiful Soup을 설치하려면 셸 또는 터미널에서 다음 명령어를 실행하세요:
pip3 install beautifulsoup4
다음 코드 스니펫은 Beautiful Soup을 사용하여 Books to Scrape 웹사이트의 데이터를 파싱합니다:
import requests
from bs4 import BeautifulSoup
# 스크래핑할 웹페이지 URL
books_page_url = "https://books.toscrape.com/"
# 웹페이지 콘텐츠 가져오기
response = requests.get(books_page_url)
# 요청 성공 여부 확인
if response.status_code == 200:
# 페이지 HTML 콘텐츠 파싱
soup_parser = BeautifulSoup(response.text, 'html.parser')
# 도서 정보가 포함된 모든 기사 찾기
book_articles = soup_parser.find_all('article', class_='product_pod')
# 각 도서 기사를 순회하며 제목과 가격 추출
for book_article in book_articles:
# 도서 제목 추출
book_name = book_article.h3.a['title']
# 도서 가격 추출
book_cost = book_article.find('p', class_='price_color').text
# 책 제목과 가격 출력
print(f"Title: {book_name}, Price: {book_cost}")
else:
# 페이지 가져오기 실패 시 오류 메시지 출력
print("Failed to retrieve the webpage")
이 코드를 테스트하려면 beautifulsoup_books_scrape.py라는 파일로 저장하고 다음 명령어로 실행하세요:
python3 beautifulsoup_books_scrape.py
터미널이나 셸에 첫 페이지의 모든 책 제목과 가격이 출력됩니다:
…출력 생략…
Title: Soumission, Price: £50.10
Title: Sharp Objects, Price: £47.82
Title: Sapiens: A Brief History of Humankind, Price: £54.23
Title: The Requiem Red, Price: £22.65
Title: The Dirty Little Secrets of Getting Your Dream Job, Price: £33.34
…출력 생략…
웹 스크래핑을 처음 접하는 분이라면, Beautiful Soup의 단순성과 HTML 트리 탐색 능력 덕분에 웹 스크래핑 프로젝트에 적합한 선택이 될 것입니다.
HTMLParser
HTMLParser는 Python에 사전 설치된 라이브러리로, HTML 문서에서 데이터를 파싱하고 추출할 수 있게 해줍니다.
기능 및 사용 편의성
HTMLParser는 lxml이나 html5lib 같은 다른 파싱 라이브러리가 제공하는 일부 기능이 부족하지만, HTMLParser의 단순성과 Python 통합성은 HTML 콘텐츠가 일관된(예: 정적 웹 페이지 스크래핑) 간단한 데이터 구조를 가진 프로젝트에 적합한 선택입니다. 그러나 형식이 잘못된 HTML 콘텐츠를 다루는 경우에는 HTMLParser가 최선의 선택이 아닙니다.
속도
HTMLParser의 속도는 소규모에서 중간 규모의 문서(즉, 몇 킬로바이트에서 몇 메가바이트 크기)를 다루고 사전 처리 요구사항이 최소인 대부분의 HTML 파싱 사용 사례에 적합합니다. 그러나 더 복잡한 HTML 문서의 경우 lxml과 같은 파서를 사용하는 것이 선호됩니다.
최신 HTML 표준 지원
HTMLParser는 기본적인 HTML 파싱을 지원하지만, 매우 복잡하거나 형식이 잘못된 HTML 문서에서는 어려움을 겪을 수 있습니다. 또한 최신 HTML5 표준을 완전히 지원하지 않습니다.
문서화 및 지원
HTMLParser는 Python 라이브러리의 일부이므로 신뢰할 수 있는 문서와 지원을 제공합니다. Stack Overflow, GitHub, Python 관련 포럼과 같은 플랫폼을 통해 도움을 쉽게 찾을 수 있습니다.
코드 예시
앞서 언급한 바와 같이, HTMLParser 모듈은 Python 표준 라이브러리에 포함되어 있으므로 추가 설치가 필요하지 않습니다.
다음은 html.parser를 사용하여 HTML 데이터를 파싱하는 코드 예시입니다:
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("시작 태그 발견:", tag)
def handle_endtag(self, tag):
print("종료 태그 발견 :", tag)
def handle_data(self, data):
print("데이터 발견 :", data)
parser = MyHTMLParser()
html_data = """
<html>
<head><title>Example</title></head>
<body><h1>헤딩</h1><p>단락.</p></body>
</html>
"""
parser.feed(html_data)
이 스크립트에서는 HTMLParser 클래스를 확장하여 시작 태그, 종료 태그 및 각 요소의 표시를 관리하는 HTML 파서를 생성합니다.
이 코드를 사용하려면 htmlparser_example.py라는 파일로 저장하고 터미널 또는 셸에서 다음 명령어로 실행하세요:
python3 htmlparser_example.py
출력에는 각 태그와 데이터가 표시됩니다:
…출력 생략…
시작 태그 발견: html
데이터 발견:
시작 태그 발견: head
시작 태그 발견: title
데이터 발견: Example
종료 태그 발견: title
종료 태그 발견: head
…출력 생략…
lxml
lxml은 내장된 XML 라이브러리의 강력한 기능과 파이썬의 사용 편의성을 결합했기 때문에 웹 스크래핑 및 데이터 추출에 널리 사용됩니다.
기능 및 사용 편의성
lxml은 HTML 및 XML 문서 탐색과 분석을 위한 효율적이고 다재다능한 기능 덕분에 널리 사용됩니다. XPath, XSLT, XPointer를 포함한 고급 XML 처리 기능을 제공하여 데이터를 정밀하게 추출하고 변환할 수 있습니다.
Beautiful Soup과 마찬가지로 lxml은 트리 구조를 지원하여 HTML 콘텐츠를 쉽게 탐색하고 구문 분석할 수 있습니다. 다양한 콘텐츠를 다루는 경우, 형식이 지정된 문서와 형식이 제대로 지정되지 않은 문서 모두에서 잘 작동하는 기능이 유용할 수 있습니다.
속도
lxml은 libxml2 및 libxslt와 같은 C 라이브러리를 활용하여 속도와 효율성으로 잘 알려져 있습니다. 이로 인해 lxml은 다른 파싱 라이브러리보다 빠르며, 특히 대규모 HTML 테이블에서 깊게 중첩된 데이터를 추출하는 것과 같은 방대한 문서나 복잡한 파싱 작업을 처리할 때 더욱 두드러집니다.
lxml은 마감 기한이 촉박한 프로젝트나 대량의 데이터 처리가 필요한 프로젝트에 탁월한 선택입니다.
최신 HTML 표준 지원
lxml은 HTML5 파일 및 구조가 불량한 HTML을 포함한 최신 웹 기술을 처리할 수 있습니다. 따라서 HTML 품질과 구조가 다양할 수 있는 웹 스크래핑 작업에 lxml을 사용하는 것이 최선의 선택 중 하나입니다.
문서화 및 지원
lxml은 모든 수준의 개발자를 위한 상세한 예제가 포함된 포괄적인 문서를 제공합니다. 또한 Stack Overflow 및 GitHub와 같은 플랫폼에서 추가 정보, 문제 해결 팁 및 모범 사례를 찾을 수 있습니다.
lxml을 활용한 웹 스크래핑에 대해 자세히 알아보세요 .
코드 예시
lxml을 설치하려면 다음을 실행하세요:
pip3 install lxml
다음 예제는 lxml로 HTML 데이터를 파싱하는 방법을 보여줍니다:
from lxml import html
html_content = """
<html>
<body>
<h1>Hello, world!</h1>
<p>This is a paragraph.</p>
</body>
</html>
"""
tree = html.fromstring(html_content)
h1_text = tree.xpath('//h1/text()')[0]
print("H1 text:", h1_text)
p_text = tree.xpath('//p/text()')[0]
print("Paragraph text:", p_text)
여기서는 lxml을 사용해 HTML 콘텐츠를 파싱한 후, XPath 표현식으로 HTML 요소에서 텍스트를 추출합니다.
lxml을 테스트하려면 이 코드를 lxml_example.py 파일로 저장한 후 셸 또는 터미널에서 다음 명령어로 실행하세요:
python3 lxml_example.py
<h1> 및 <p> 요소에서 추출한 텍스트가 다음과 같이 출력됩니다:
H1 text: Hello, world!
Paragraph text: This is a paragraph.
XPath 쿼리의 복잡성( XML 유형이나 다중 항목 등)을 처리할 수 있는 완전한 생산 환경용 파서가 필요하다면 lxml을 사용해야 합니다.
PyQuery
PyQuery는 jQuery와 유사한 Python용 라이브러리로, 몇 초 만에 전체 웹 페이지를 스크랩할 수 있게 해줍니다.
기능과 사용 편의성
jQuery 구문과 유사한 PyQuery는 사용자 친화적입니다. 요소를 쉽게 선택하고, 반복 처리하고, 내용을 업데이트하고, HTML 속성을 관리할 수 있습니다. 이는 HTML 페이지에서 데이터를 추출하여 작업해야 하는 웹 스크래핑과 같은 작업에 특히 유용합니다.
PyQuery는 CSS 선택기도 지원하므로, jQuery를 사용하여 DOM 문서를 애니메이션하는 데 이미 익숙하다면 쉽게 시작할 수 있습니다.
속도
PyQuery는 HTML 파싱에 lxml 라이브러리를 사용합니다. 이로 인해 사용하기는 쉽지만 lxml을 직접 사용하는 것보다 느립니다.
최신 HTML 표준 지원
PyQuery는 최신 HTML5 표준을 준수하며, 파싱에 lxml을 사용하기 때문에 구조화된 HTML과 비구조화된 HTML을 모두 처리할 수 있습니다.
문서화 및 지원
PyQuery는 신속한 시작을 돕는 상세한 문서를 제공합니다. 다른 라이브러리에 비해 커뮤니티 규모는 작지만, 40명 이상의 기여자가 활발히 지원하고 있습니다. 또한 온라인 포럼, Stack Overflow, 다양한 튜토리얼 등 문제 발생 시 도움을 받을 수 있는 추가 자료도 마련되어 있습니다.
코드 예시
PyQuery를 설치하려면 다음 명령어를 실행하세요:
pip3 install pyquery
다음은 pyquery를 사용하여 HTML 데이터를 파싱하는 코드 스니펫입니다:
from pyquery import PyQuery as pq
html_content = """
<html>
<body>
<h1>Hello, from PyQuery!</h1>
<p>This is a paragraph.</p>
</body>
</html>
"""
doc = pq(html_content)
h1_text = doc('h1').text()
print("H1 텍스트:", h1_text)
p_text = doc('p').text()
print("단락 텍스트:", p_text)
이 코드 조각에서는 HTML 콘텐츠를 파싱한 후 특정 요소에서 텍스트를 추출합니다.
이 코드를 pyquery_example.py라는 파일로 저장하고 셸 또는 터미널에서 다음 명령어로 실행하세요:
python3 pyquery_example.py
출력 결과는 다음과 같습니다:
H1 text: Hello, from PyQuery!
Paragraph text: This is a paragraph.
jQuery 사용법을 이미 알고 유사한 기능을 찾고 있다면 PyQuery가 훌륭한 선택입니다.
Scrapy
Scrapy는 유연하고 오픈 소스인 웹 스크래핑 프레임워크로, 사용자가 정보를 수집하기 위한 스파이더를 구축하고 운영할 수 있게 합니다. HTTP 요청 관리부터 추출된 데이터의 파싱, 처리, 저장까지 스크래핑 작업의 모든 측면을 처리하는 도구를 제공합니다. 이 프레임워크는 스크래핑 작업에 수반되는 모든 복잡성을 관리하므로 원하는 정보 수집에 집중할 수 있습니다.
기능 및 사용 편의성
Scrapy는 사용 편의성을 위해 설계되었으며 모듈식 프레임워크로 복잡한 웹 데이터 파싱에 탁월합니다. HTML 및 XML 탐색을 위한 XPath 및 CSS 선택기를 제공하며, 대규모 스크래핑에 필수적인 요청 스로틀링, 사용자 에이전트 스푸핑, IP 로테이션과 같은 유틸리티를 포함합니다.
속도
Scrapy는 효율적입니다. 네트워킹 기능을 통해 요청을 동시 처리하여 데이터 검색을 수행할 수 있습니다. 이는 대규모 데이터 세트를 처리하거나 상업용 웹사이트를 스크래핑할 때 특히 강력합니다.
최신 HTML 표준 지원
Scrapy는 HTML5 표준을 지원하며 동적으로 생성된 자바스크립트를 포함하는 복잡한 웹사이트도 처리할 수 있습니다. Scrapy 자체는 자바스크립트를 처리하지 않지만, Selenium과 같은 도구와 함께 작동하여 자바스크립트 페이지를 관리합니다.
동적 콘텐츠 스크래핑 방법에 대한 자세한 내용은 여기에서 확인하세요.
문서 및 지원
Scrapy는 방대한 문서와 이를 뒷받침하는 활발한 커뮤니티를 보유하고 있습니다. 공식 문서는 기본 사용법부터 고급 주제까지 필요한 모든 내용을 다루며, 모든 수준의 개발자를 지원하기 위한 다양한 예제, 가이드 및 권장 사항을 포함합니다.
또한 Scrapy 커뮤니티는 포럼과 GitHub 저장소를 통해 활발히 소통하며, 여러분이 직면한 모든 문제에 대해 도움을 구하고 리소스에 접근할 수 있도록 보장합니다.
코드 예제
Scrapy를 설치하려면 다음을 실행하세요:
pip3 install scrapy
다음은 Scrapy 스파이더를 사용하여 데이터를 추출하는 예시입니다:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
이 스크립트는 스파이더 클래스를 정의하고 시작 URL을 설정하며, 응답을 파싱하여 데이터를 추출하는 방법을 지정합니다.
이 코드를 quotes_spider.py라는 파일로 저장하고 터미널 또는 셸에서 다음 명령어로 실행하세요:
scrapy runspider quotes_spider.py -o quotes.json
이 코드를 실행하면 Scrapy가 ‘Quotes to Scrape’ 페이지를 크롤링하고 해당 페이지의 데이터 인용문과 각 인용문의 저자 및 태그를 추출 및 파싱합니다. 그런 다음 Scrapy는 추출한 데이터를 다음과 같은 형식의 quotes.json 파일에 저장합니다:
[
{"text": "u201c우리가 창조한 세상은 우리의 사고 과정이다. 사고를 바꾸지 않고서는 세상을 바꿀 수 없다.u201d", "author": "Albert Einstein", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"text": "u201c우리의 능력보다 선택이 진정한 우리 모습을 보여준다, 해리.u201d", "author": "J.K. Rowling", "tags": ["abilities", "choices"]}
…출력 생략...
]
특정 요구사항이 있는 복잡한 웹 추출 프로젝트의 경우, 풍부한 기능과 확장성을 갖춘 Scrapy가 훌륭한 선택지입니다.
결론
이 글에서는 Beautiful Soup, HTMLParser, lxml, PyQuery, Scrapy 등 파이썬용 HTML 파서 5가지를 살펴보았습니다.
Beautiful Soup은 단순성 덕분에 초보자에게 적합합니다. HTMLParser는 기본적인 파싱 요구사항을 위한 가벼운 옵션입니다. lxml은 더 나은 성능과 XPath 지원을 원한다면 고려해볼 만한 선택지입니다. PyQuery는 jQuery와 유사한 간편함을 Python에 제공합니다. 대규모 스크래핑 프로젝트를 수행한다면 Scrapy 프레임워크를 사용하세요.
스크래핑 과정 없이 바로 데이터를 얻고 싶으신가요? 지금 가입하여 무료 샘플을 다운로드하고 저희 데이터셋을 확인해 보세요.