파이썬(Python)/웹스크롤링

[Python] RE 모듈로 미세먼지 데이터 필터링하기(정규표현, 특수문자)

끄적끄적아무거나 2022. 5. 30. 18:19
반응형

 

목차

     

     

    미세먼지(PM10, PM25) 정보 가져오기

     

    앞서 포스트에서 미세먼지 정보를 공공 데이터 포털에서 API를 사용해서 가져오는 방법에 대해 알아보았습니다. (https://scribblinganything.tistory.com/530) 상세 내용은 링크를 통해 확인하시면 됩니다.

     

    결과는 아래와 같이 나왔습니다. 이번 포스트는 아래 결과를 사용해서 파이썬에서 제공하는 정규표현 함수 re 함수를 사용해서 원하는 결과를 가져오는 방법에 대해 알아보겠습니다. 

     

    미세먼지 결과>>

    <?xml version="1.0" encoding="UTF-8"?>
    
    <response>
      <header>
        <resultCode>00</resultCode>
        <resultMsg>NORMAL_CODE</resultMsg>
      </header>
      <body>
        <items>
          <item>
            <so2Grade>1</so2Grade>
            <coFlag/>
            <khaiValue>72</khaiValue>
            <so2Value>0.003</so2Value>
            <coValue>0.4</coValue>
            <pm25Flag/>
            <pm10Flag/>
            <o3Grade>2</o3Grade>
            <pm10Value>27</pm10Value>
            <khaiGrade>2</khaiGrade>
            <pm25Value>24</pm25Value>
            <sidoName>서울</sidoName>
            <no2Flag/>
            <no2Grade>1</no2Grade>
            <o3Flag/>
            <pm25Grade>2</pm25Grade>
            <so2Flag/>
            <dataTime>2022-05-30 08:00</dataTime>
            <coGrade>1</coGrade>
            <no2Value>0.019</no2Value>
            <stationName>중구</stationName>
            <pm10Grade>1</pm10Grade>
            <o3Value>0.040</o3Value>
          </item>
     
     #####생략#####
     
        </items>
        <numOfRows>100</numOfRows>
        <pageNo>1</pageNo>
        <totalCount>40</totalCount>
      </body>
    </response>

     

     

     

     

    정규표현라이브러리 RE 기본 사용법(REGEX) : . + ^ $  ()

     

    이번에는 정규 표현에서 가장 많이 사용하는 기호에 대해 알아보겠습니다. 제가 주로 사용하는 기호는 위의 목차 제목과 같이 . + ^ $ ( ) 가 있습니다.

     

    해당 문자의 기능은 아래와 같습니다.

     

    • Period 마침표 .  : 하나의 어떠한 문자를 의미함
    • Plus sign 더하기 + : 앞의 문자가 1 이상 있을 수 있음
    • Circumflex 삿갓 ^ : 문자의 시작
    • Dollar sing 달러 $ : 문자의 끝
    • 소괄호 () : 내부 조건만을 출력으로 보냄

     

    아래 예제를 통해 마침표와 더하기 특수문자 사용법을 쉽게 이해해보겠습니다.

     

    예제코드>>

    import requests
    import re
    
    dust = requests.get("API키값")
    
    dust.raise_for_status()
    print("reponse : ", dust.status_code) 
    
    with open("dust_info.html", "w", encoding="utf8") as f:
        f.write(dust.text)
    
    filtered_data = re.findall(r"<stationName>.+</stationName>", dust.text)
    print(filtered_data)

    4~10번 라인: 앞서 포스트 스크롤링(Scrawling)에서 사용 방법에 대해 알아보았습니다.

    12번 라인: findall 함수를 사용해서 검색 필터(Filter)에 일치하는 값을 모두 찾습니다. .+ 를 사용해서 사이에 들어가는 모든 문자를 검색합니다.

     

     

    결과>>

    결과는 아래와 같이 리스트(list)로 출력 됩니다.

    reponse :  200
    ['<stationName>중구</stationName>', '<stationName>한강대로</stationName>', '<stationName>종로구</stationName>', '<stationName>청계천로</stationName>', '<stationName>종로</stationName>', '<stationName>용산구</stationName>', '<stationName>광진구</stationName>', '<stationName>성동구</stationName>', '<stationName>강변북로</stationName>', '<stationName>중랑구</stationName>', '<stationName>동대문구</stationName>', '<stationName>홍릉로</stationName>', '<stationName>성북구</stationName>', '<stationName>정릉로</stationName>', '<stationName>도봉구</stationName>', '<stationName>은평구</stationName>', '<stationName>서대문구</stationName>', '<stationName>마포구</stationName>', '<stationName>신촌로</stationName>', '<stationName>강서구</stationName>', '<stationName>공항대로</stationName>', '<stationName>구로구</stationName>', '<stationName>영등포구</stationName>', '<stationName>영등포로</stationName>', '<stationName>동작구</stationName>', '<stationName>동작대로 중앙차로</stationName>', '<stationName>관악구</stationName>', '<stationName>도 
    산대로</stationName>', '<stationName>강남대로</stationName>', '<stationName>송파구</stationName>', '<stationName>강동구</stationName>', '<stationName>천호대로</stationName>', '<stationName>금천구</stationName>', '<stationName>시흥대로</stationName>', '<stationName>강북구</stationName>', '<stationName>양천구</stationName>', '<stationName>노원구</stationName>', '<stationName>화랑로</stationName>', '<stationName>강 
    남구</stationName>', '<stationName>서초구</stationName>']

     

     

     

     

     

     

    앞서 예제는 마침표 점과 더하기 기호로 검색하는 방법에 대해 알아보았습니다. 이번에는 괄호 기호를 사용해서 원하는 결과를 출력 해보겠습니다.

     

    예제 코드>>

    import requests
    import re
    
    dust = requests.get("API키값")
    
    dust.raise_for_status()
    print("reponse : ", dust.status_code) 
    
    with open("dust_info.html", "w", encoding="utf8") as f:
        f.write(dust.text)
    
    filtered_data = re.findall(r"<stationName>(.+)</stationName>", dust.text)
    print(filtered_data)

    12번 라인: 앞서 코드와 동일 하고 12번 라인 코드에 () 소괄호만 추가 되었습니다. 괄호를 사용해서 괄호 안의 값만을 출력으로 가져 옵니다.

     

     

    결과>>

    reponse :  200
    ['중구', '한강대로', '종로구', '청계천로', '종로', '용산구', '광진구', '성동구', '강변북로', '중랑구', '동대문구', '홍릉로', '성북구', '정릉로', '도봉구', '은평구', '서대문구', '마포구', '신촌로', '강서구', '공항대로', '구로구', '영등포구', '영등포로', '동작구', '동작대로 중앙차로', '관악구', '강남구', '서초구', '도산대로', '강남대로', '송파구', '강동구', '천호대로', '금천구', '시흥대로', '강북구', '양천구', '노 
    원구', '화랑로']

     

     

     

    삿갓과 달라 표시의 특수 기호는 문자열 검색에 사용되어서 미세먼지데이터를 XML 문서로 가져오면 모든 내용은 <> 괄호에 쌓여 있어서 사용이 어렵습니다.

    반응형