본문 바로가기

기타/python

python 정규표현식 예제

728x90


웹 크롤링을 할 때 문자열 탐색을 보다 효율적으로 하기 위해서는 정규표현식 사용이 필수이다.

정규표현식을 사용하면 디테일한 문자열 검색이 가능하다.

아래 예제를 보자

아래 예제는 네이버의 뉴스 카테고리에서 미국 대선을 검색했을 때 

'https://news.naver.com/main/read.nhn'로 시작하는 a태그를 가져오는 코드입니다.

urlib을 통해 페이지의 html 코드를 가져오고 그것을 bs4를 통해 처리해 a태그만 가져옵니다.

그런 후 정규표현식을 사용해서 문자열을 하나하나 검색하면서 조건에 맞는 링크 정보를 가져옵니다.

이렇듯 디테일한 검색을 위해서는 정규표현식 사용이 필수입니다.

'^http(s)?:\/\/(news)\.(naver)\.(com)\/(main)\/(read)\.(nhn)'을 컴파일한 뒤 match함수를 통해 문자열의 시작부터 해당 문자열이 있는지 검색합니다.

전체에서 검색하기 위해서는 search(), 정규식과 매치되는 모든 문자열을 리스트로 받으려면 findall()을 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 받기 위해서는 finditer()을 사용하시면 됩니다.

 

디테일한 url 정규표현식

url을 정규표현식으로 표현하는 방법은 다음과 같습니다.

바로 사용하실 수 있게 짧고 간결하게 설명하겠습니다.

^http(s)?:\/\/   이부분은 https://을 표현한 부분입니다. 

(news)는 이런 문자열이 나오는가를 의미합니다. 뒤에 있는 (naver) 등도 마찬가지입니다.

\.  은 . 이찍혀 있어야 한다는 의미입니다.

만약 balmostory.tistory.com/ 로 시작하는 문자열을 검색하시려면

^(balmostory)\.(tistory)\.(com)\/  을 사용하면 되겠지요.

 

import urllib.request
import urllib.parse 
from bs4 import BeautifulSoup
import re
key_words=urllib.parse.quote("미국대선")
with urllib.request.urlopen('https://search.naver.com/search.naver?where=news&sm=tab_jum&query='+key_words) as response:
    data=(response.read())

print(data)

from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
anchor_set=soup.find_all('a')
new_link=[]

searchtext=re.compile('^http(s)?:\/\/(news)\.(naver)\.(com)\/(main)\/(read)\.(nhn)')

for i in anchor_set:
    #정규표현식을 통해 조건에 맞는 href만 가져온다.
    try :
        if searchtext.match(str(i['href'])) != None:
            new_link.append(i['href'])
    except :
        pass

 

 

728x90