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

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

by 에디터 윤슬 2024. 12. 31.
import re
from html import unescape

# 이전 절에서 다운로드한 파일을 열고 html이라는 변수에 저장합니다.
with open('dp.html') as f:
    html = f.read()

# 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('---')

 

re 모듈을 읽어 들입니다.
› import re
# re.search() 함수를 사용하면 두 번째 매개변수의 문자열이 첫 번째 매개변수의 정규 표현식에 맞는지 확 인할 수 있습니다.
# 맞는 경우 Match 객체를 반환합니다. 맞지 않으면 None을 반환합니다.
# 다음 예에서는 Match 객체가 반환됐습니다.
# match='abc'를 보면 abc가 매치된 것을 확인할 수 있습니다.
》 re.search(T'a.*', *c', )
<sre. SRE_Match object; span=(0, 3), match='abc'>

# 다음 예는 정규 표현식에 맞지 않으므로 None을 반환합니다.
# 인터랙티브 셀에서는 결과가 없을 경우 곧바로 다음 프롬프트(>)을 출력합니다.
»»> re. search(r'a.*d'
', 'abc123DEF')

# 세 번째 매개변수로 옵션을 지정합니다.
# Te.IGNORECASE (또는 re.T)를 지정하면 대소문자를 무시합니다.
# 이외에도 굉장히 다양한 옵션이 있습니다.
»»> re.search(r'a.*d', 'abc123DEF', re. IGNORECASE)
<sre.SRE_Match object; span=(0, 7), match='abc123D'>

# Match 객체의 group() 메서드로 일치한 값을 추출합니다.
# 매개변수에 0을 지정하면 매치된 모든 값을 반환합니다.
›> m= re search(r'a(.*)c', 'abc123DEF')
›› m.group(0)
'abc'

# 매개변수에 1 이상의 숫자를 지정하면 정규 표현식에서 ()로 감싼 부분에 해당하는 값을 추출합니다.
# 1이라면 1번째 그룹, 2라면 2번째 그룹이 추출됩니다.
> m.group (1)
'b'

# re.findall() 함수를 사용하면 정규 표현식에 맞는 모든 부분을 추출할 수 있습니다.
# 다음 예에서는 2글자 이상의 단어를 모두 추출합니다.
* \w는 유니코드로 글자를 비교합니다. 이 밖에도 공백 문자는 \s 등으로 추출할 수 있습니다.
»> re.findall(r'|w{2,}', 'This is a pen')
['This is a pen')

# re.sub() 함수를 사용하면 정규 표현식에 맞는 부분을 바꿀 수 있습니다.
# 3번째 매개변수에 넣은 문자열에서 첫 번째 정규 표현식에 맞는 부분을 # 2번째 매개변수로 변경합니다.
》 re.sub(r'\w{2,}', 'That', 'This is a pen')
'That That a That'