정규표현식으로 스크레이핑

Python Crawling

re모듈을 익히고 정규표현식으로 html파일 접근하기

nackta true
07-17-2021

정규표현식은 특정한 문자열의 집합을 표현하는 방법이다. 이 방법을 통해 html에서 원하는 정보만을 추출 할 수 있다.

re모듈

re모듈 안에는 정규표현식과 관련된 함수를 제공한다.

import re

re.search(“정규표현식”, 문자열) 함수는 문자열이 정규표현식에 맞는지 확인해준다. 맞는 경우 match객체를 반환하고 맞지 않는 경우 None을 반환한다.

#a 그리고 모든 문자 중 한가지가 0개 이상 포함하고 다음 c인 문자열
re.search(r'a.*c', 'abc123DEF')
<re.Match object; span=(0, 3), match='abc'>
print(re.search(r'a.*d', 'abc123DEF')) # 결과 없음(None)
None
# a 그리고 모든 문자 중 0개 이상 포함하고 다음 D인 문자열
result = re.search(r'a.*D', 'abc123DEF')
start, end = result.span()
print(start, end) # 위치
0 7
print(result.string) # 해당 문자열
abc123DEF

re.IGNORECASE(또는 re.I)를 지정하면 대소문자를 무시한다.

m1 = re.search(r'a.*d', 'abc123DEF')
m2 = re.search(r'a.*d', 'abc123DEF', re.I)
print(m1) #none
None
print(m2)
<re.Match object; span=(0, 7), match='abc123D'>

match객체의 group()을 통해 일치한 값을 추출 할 수 있다.

m = re.search(r'a(.*)(c)', 'abc123DEF')
m.group(0) # 일치된 모든 값
'abc'
m.group(1) # 정규표현식에서 첫번째 괄호 일치 값
'b'
m.group(2) # 두번째 괄호 일치 값
'c'

re.findall() 함수는 정규표현식에 맞는 모든 부분을 추출한다.

#영숫자 문자나 언더바가 2~3개로 이어진 문자열.
re.findall(r'\w{2,3}', 'This is pen')
['Thi', 'is', 'pen']

re.sub() 함수는 정규표현시에 매칭되는 문자열 치환한다.

re.sub(정규표현식, replace, stirng)

#영숫자 문자나 언더바가 4개로 이어진 문자열.
#정규표현식에 맞는 문자열을 That으로 바꾼다.
re.sub(r'\w{4}', 'That', 'This is a pen')
'That is a pen'

match() : 시작되는 문자열이 정규표현식과 일치하는지 확인.

search() : 문자열 내에서 정규표현식과 일치하는 부분을 확인.

result = re.match(r'a.*c', ' abc123DEF') # 시작부분에 빈칸
print(result)
None
result = re.search(r'a.*c', ' abc123DEF')
print(result)
<re.Match object; span=(1, 4), match='abc'>

정규표현식으로 스크레이핑

목표 : 정규표현식으로 전체도서목록 책이름과 url 추출하기.

# html 추출.
from urllib.request import urlopen
import sys
f = urlopen('https://www.hanbit.co.kr/store/books/full_book_list.html')
html = f.read().decode('utf-8')

html자료를 html변수에 저장한다.

크롬에서 F12를 누르면 html의 elements를 볼 수 있다. 전체도서목록에서 도서제목과 url이 나열되있는 부분을 찾는다.

from html import unescape
# re.findall() 메서드를 통해 도서 하나에 해당하는 HTML을 추출
for partial_html in re.findall(r'<td class="left"><a.*?</td>', html, re.DOTALL):
    # 도서의 URL을 추출
    url = re.search(r'<a href="(.*?)">', partial_html).group(1)
    url = 'http://www.hanbit.co.kr' + url
    # 태그를 제거해서 도서의 제목을 추출
    title = re.sub(r'<.*?>', '', partial_html)
    title = unescape(title)
    print('url:', url)
    print('title:', title)
    print('---')
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7422209817
title: 변화하는 세계 질서
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2317469552
title: 혼자 공부하는 얄팍한 코딩 지식
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7975223427
title: 때려치우기의 기술
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9882279606
title: 완성된 웹사이트로 배우는 HTML&CSS 웹 디자인
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6334451644
title: 실무자를 위한 그래프 데이터 활용법
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B1207366943
title: 구글 엔지니어는 이렇게 일한다
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B4597837371
title: 리얼 국내여행 2022~2023(개정판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2885456605
title: 벌레가 되어도 출근은 해야 해
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B3346434043
title: 일잘러의 비밀, 엑셀 대신 파이썬으로 업무 자동화하기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6493543959
title: 리얼 제주 [2022~2023년 최신판]
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7170139829
title: STEM@CookBook, 공학 기초수학(2판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9103889809
title: 똑똑한 두뇌 연습 : 300개 미로찾기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6446476778
title: 엑셀, R, 파이썬으로 시작하는 데이터 분석
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B1913587019
title: MLOps 도입 가이드
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2831223974
title: 엑셀이 편해지는 파이썬
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B3180984708
title: 올림포스 연대기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2949290774
title: 쉽게 배우는 AWS AI 서비스
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9483006177
title: 상식적으로 상식을 배우는 법
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B8613567974
title: 엑셀로 부자되기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B1519857692
title: 저는 해외주식투자가 처음인데요
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7550382130
title: 데이터 익명화를 위한 파이프라인
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5725043400
title: XGBoost와 사이킷런을 활용한 그레이디언트 부스팅
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9078925849
title: 동시성 프로그래밍
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9856488100
title: 우리 고양이, 이럴 땐 어떡하지?
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5392144310
title: 케라스로 구현하는 딥러닝
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5658376953
title: 엄마가 만드는 초등 수학 자신감
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2027701371
title: 파이썬을 활용한 금융 분석(2판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B3855421165
title: 유연한 소프트웨어를 만드는 설계 원칙
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5151815130
title: 대통령의 숙제
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2707221826
title: 맛있는 디자인 애프터 이펙트 CC 2022
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7121664936
title: STEM@CookBook, Beer의 정역학과 재료역학(3판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7790361118
title: 3일 만에 끝내는 초등 글쓰기 트레이닝 북
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B4309942517
title: 도메인 주도 개발 시작하기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6236324381
title: STEIN 푸리에 해석학
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B1102492805
title: 뛰지 마라, 지친다
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5538841948
title: 맛있는 디자인 프리미어 프로 CC 2022
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6113501223
title: 헤드 퍼스트 디자인 패턴(개정판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2277305433
title: 세금의 세계사
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5471282287
title: 시맨틱 데이터 모형화
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B4355310473
title: 찐 UXer가 알려주는 UX/UI 실무 가이드
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5732906061
title: 처음 배우는 엘릭서 프로그래밍
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7239224234
title: 고객을 끌어오는 구글 애널리틱스4
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2761632078
title: 자바 마이크로서비스를 활용한 SRE
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B9202577080
title: 머신러닝 실무 프로젝트(2판)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2736769991
title: 쏙쏙 한글 깨치기 1단계 듣기∙읽기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B1793194115
title: 쏙쏙 한글 깨치기 1단계 만들기∙쓰기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B7678436157
title: 쏙쏙 한글 깨치기 1단계 말놀이 동시
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B2733383112
title: 쏙쏙 한글 깨치기 1단계 세트(받침 없는 글자)
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B5654917817
title: 쏙쏙 한글 깨치기 2단계 듣기∙읽기
---
url: http://www.hanbit.co.kr/store/books/look.php?p_code=B6791524292
title: 쏙쏙 한글 깨치기 2단계 만들기∙쓰기
---

re.DOTALL은 정규표현식에서 “.”에 줄바꿈문자를 포함한 모든 문자와 매치한다는 의미이다.

html.unescape()함수는 html에서 escape된 문자열을 unescape해주는 함수이다. 위 예를 들면,

list = re.findall(r'<td class="left"><a.*?</td>', html, re.DOTALL)
title1 = re.sub(r'<.*?>', '', list[5])
print("escape:", title1)
escape: 구글 엔지니어는 이렇게 일한다
title2 = unescape(title1)
print("unescape:", title2)
unescape: 구글 엔지니어는 이렇게 일한다

이처럼 “(” -> “(” 로 unecape 됨을 확인할 수 있다.

escape code는 편집기와 브라우저가 헷갈리지 않도록 여러 기호를 표현하는 code이다.

Citation

For attribution, please cite this work as

nackta (2021, July 17). nackta blog: 정규표현식으로 스크레이핑. Retrieved from https://nackta.github.io/posts/2021-07-17-python-crawler2/

BibTeX citation

@misc{nackta2021정규표현식으로,
  author = {nackta, },
  title = {nackta blog: 정규표현식으로 스크레이핑},
  url = {https://nackta.github.io/posts/2021-07-17-python-crawler2/},
  year = {2021}
}