[Python.Web] 정규표현식을 이용한 웹 데이터 파싱 - urllib, regular expression

2020. 11. 13. 05:00Python과 머신러닝/웹 데이터 추출

웹사이트에서 원하는 형태의 데이터를 긁어오는 방법을 알아보자.

 

0. 요약

1. 원하는 URL을 정한다.

2. URL로부터 모든 text를 string으로 읽어온다.

3. 내가 찾고자 하는 string을 regular expression 형태로 정의한다.

4. re 라이브러리를 사용해서 원하는 text 부분들을 모두 추출한다.

import re
from urllib import request

url="http://www.itemmania.com/notice/view.html?pub=PORTAL&type=all&nowPage=1&id=1542"
html_str=str(request.urlopen(url).read())
#print(html_str)

results = re.findall(r"\w+\*{3}", html_str)
for result in results:
    print(result)
  • regular expression(정규표현식)이 뭔지만 이해하고 나면 아주 간단한 작업이다.

  • 위 코드의 논리를 한 걸음씩 이해해보자.

 

1. 원하는 URL을 정한다.

url="http://www.itemmania.com/notice/view.html?pub=PORTAL&type=all&nowPage=1&id=1542"

 

2. URL로부터 모든 text를 string으로 읽어온다.

from urllib import request

url="http://www.itemmania.com/notice/view.html?pub=PORTAL&type=all&nowPage=1&id=1542"
html_str=str(request.urlopen(url).read())
print(html_str)
  • URL을 변수에 담는다

  • URL로부터 읽은 값을 string 형태로 변환하여 html_str에 담는다

  • string 값을 출력한다

  • 아주 간단하지 않은가? 위 코드를 수행하면 해당 페이지의 html source를 string 형태로 전부 받았고, 

    이를 메모장에 옮겨놓고 검색해보면 아이디가 어디 있는지 확인할 수 있을 것이다.

 

3. 내가 찾고자 하는 string을 regular expression 형태로 정의한다.

  • Regular Expression(정규표현식)이란, 문자열에서 특정 패턴의 문자열을 추출하기 위한 일종의 공식이다.

  • 예를 들어, 위에서 추출한 html 중 사용자들의 ID만 추출하고 싶다면 컴퓨터에게 어떤 명령을 넣어야 할까?

이 중 아이디만 뽑고 싶다면, 컴퓨터에게 어떻게 알려주지?

  • 말로 표현하면 이럴 것이다 : 알파벳으로 시작하고 ***(별 3개)로 끝나는 문자열을 전부 찾아줘!

  • 위와 같은 공식을, 컴퓨터가 알아들을 수 있게 정규적인 표현을 만든 것이 정규표현식의 전부이다.

  • 쉽게 말해, '내가 원하는 문자열의 규칙을 컴퓨터에게 알려주기 위한 약속 혹은 규칙'정규 표현식이다.

  • 정규표현식이 뭔지 이해했다면 '알파벳으로 시작하고 ***(별 3개)로 끝나는 문자열'을 정규 표현식으로 표현해보자

    • \w : 알파벳 한 글자를 찾아줘

    • \w+ : 알파벳 여러 글자 (단어 단위)로 찾아줘

    • \w+\* : 알파벳 단어 뒤에 별이 붙는 문자열을 찾아줘

    • \w+\*{3} : 알파벳 단어 뒤에 별이 3개 붙는 문자열을 찾아줘

  • 위 결과를 Python 코드로 넣으면 다음과 같다.

  • re는 regular expression 라이브러리이니 참고하면 좋다

import re
from urllib import request

url="http://www.itemmania.com/notice/view.html?pub=PORTAL&type=all&nowPage=1&id=1542"
html_str=str(request.urlopen(url).read())
#print(html_str)

results = re.findall(r"\w+\*{3}", html_str)

(번외 편) Regular Expression 연습 + 검증하기

  • 이와 같이 정규표현식의 세상은 생각보다 간단하다. 규칙만 알고, 조금만 연습해보면 얼마든지 적용할 수 있다.

  • 정규표현식에 대한 내용은 구글에 얼마든지 많이 나와있으니 원하는 문자열을 위한 표현식은 검색해보자.

  • 내가 생각하는 정규표현식을 검증하는 방법은 이렇게 하면 된다

   A) 원하는 URL에서 우클릭 -> 페이지 소스 보기를 한다

우클릭 -> 페이지 소스 보기

  B)  페이지 소스를 전체 전체 복사한다 (Ctrl A, Ctrl C)

  C) www.regexr.com 에 들어가서 중간 본문 부분에 붙여넣는다

regexr.com에 들어가서 복사한 html source를 붙여 넣는다

  D) 상단의 Expression 부분에 생각했던 정규표현식을 입력하고, 기대했던 값들이 나오는지 아래 Tools 영역의 List에서 확인한다.

이렇게 넣었더니
이런 결과가 나왔다. 별이 3개 필요해서 {3}을 추가하면 좋겠다.

4. re 라이브러리를 사용해서 원하는 text 부분들을 모두 추출한다.

  • 본론으로 돌아와서 마무리를 하자.

  • 원하는 정규분포식을 입력하여 원하는 값들을 results 변수에 받았으면, 각각 출력해주면 끝이다.

import re
from urllib import request

url="http://www.itemmania.com/notice/view.html?pub=PORTAL&type=all&nowPage=1&id=1542"
html_str=str(request.urlopen(url).read())
#print(html_str)

results = re.findall(r"\w+\*{3}", html_str)
for result in results:
    print(result)

 

마무리

  • HTML을 읽어서 원하는 문자열을 parsing하여 추출하는 것은 이렇게 간단하다.

  • 페이지에서 원하는 값의 패턴만 정의할 수 있다면, 정규표현식으로 python에 요청하면 빠르게 추출할 수 있다.

  • 네이버 스토어에서 판매되는 특정 제품의 평균 가격이랄지, 경쟁 상대들의 리뷰 및 판매 수 등등을 파악할 수 있다.

  • 이제 웹에서 어떤 데이터도 추출할 수 있으니, 이를 기반으로 빅데이터 분석을 시작해보자.

 

관련 포스트

 

[Python.Web] wget으로 웹 데이터 다운로드 및 파싱 - wget.download

요약 한 웹사이트에서 여러 가지의 파일을 다운로드하고 싶을 때에, wget을 사용하여 한번에 다운 받는 프로그램을 짤 수 있다 이전에 정리한 내용에 이어서, 정규식을 사용하여 원하는 파일을

coding-grandpa.tistory.com

 

[Python.Web] 실시간 금융 데이터 파싱하기 추출

요약 URL로부터 정보를 뽑아오는 3번째 예제이다 (앞의 예제를 못 봤다면 참고해야 이해가 될 것이다) Python으로 웹사이트에서 데이터 추출하기 (urllib, regular expression) 웹사이트에서 원하는 형태의

coding-grandpa.tistory.com

 

[Python.Web] BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑

요약 XML이란 eXtensible Markup Language의 약자로 데이터의 구조와 의미를 설명하기 위해 Tag(Markup)를 사용하는 언어이다. HTML과 비슷하게 데이터가 정형화되어 있어 분석이 편리하고, 이를 더욱 쉽게 Pa

coding-grandpa.tistory.com

 

[Python.Web] BeautifulSoup과 wget 으로 웹크롤링, 데이터 스크레이핑

요약 지난 내용은 다운로드하여놓은 xml파일을 분석했다면, 이번엔 웹에서 다운로드하는 단계까지 자동화한다 BeautifulSoup으로 하는 웹크롤링, 데이터 스크레이핑 요약 XML이란 eXtensible Markup Languag

coding-grandpa.tistory.com

 

반응형