매우 당황스러운 일이 생겼다. 몇 안되는 스크래핑 내용 (제목, 링크, 날짜) 중에서 날짜가 문제가 생겼다. 각 사이트가 날짜 기록 방식이 다르다..... 각 사이트는 아래와 같은 형식으로 날짜값을 가져온다. 이게 웃기는게, 현재 날짜 시점으로 오늘이면 시간을 보여주고, 오늘이 아니면 날짜를 보여준다. 이렇게 값이 바뀌니까 더 애매해졌다.


- 퀘이사존 00:38 , 08-18
- 클리앙 10:43 , 08-18
- 펨코  01.20, 2020.08.18
- 루리웹  01:08, 2020.08.18
- 뽐뿌  15:56:32, 20/08/16

 

아무튼, 날짜까지 빼버릴 순 없기에, 어떻게든 해볼라고 정말 고군분투했다. 뭔가 아는게 있어야 시작이라도 할텐데... 다행히 어디서 주워들은 정규화부터 차근차근 알아보며 공부하기 시작했다. 다행히 허접하지만 어떻게든 작동하는 알고리즘을 만들 수 있었다.

# 당일이면 시간, 당일이 아니면 날짜로 가져온다. 그런데 날짜나 시간 값이 제각각이다. 
def extractDate(a): 
    if ":" in a:   ## 먼저 받은 값에 : 가 있는지 확인한다. (시간인지 아닌지 여부) 
        return a[0:5]  ## 시간이 맞으면, 앞에서 다섯자리만 가져온다. 
    else:  ## : 가 없으면 날짜일 것이다. 
        if len(a) > 6:  ## 날짜의 길이가 6자리를 초과하면, 아래와 같이 정규화 식을 따른다. 
            ## 섹션1 : (\d{4}|\d{2}) 중간값 : [\/|.|-]  섹션2 : (\d{2})  중간값 : [\/|.|-]  섹션3 : (\d{2})  의 정규화 형식을 따른다. 
            # 섹션1은 숫자가 4개 또는 2개, 섹션2는 숫자가 2개, 섹션3은 숫자가 2개 인 형태이다. 
            # 중간값은 / 또는 . 또는 - 를 구분한다. 
            # a라는 변수에서 위와 같은 내용을 검사한다. 
            date = re.findall('(\d{4}|\d{2})[\/|.|-](\d{2})[\/|.|-](\d{2})', a) 
            parseddate = "+" + date[0][1] + "-" + date[0][2]
            ## 값은 리스트 안의 튜플 형식으로 나온다. 그래서 리스트 첫번째 값의 튜플0은 년, 튜플1은 월, 튜플2는 일 이므로 튜플1,2만 가져온다. 
            return parseddate 
        else: 
            return "+" + a ## 만약 날짜의 길이가 6자리를 초과하지 못했다면, 맞는 날짜이므로 그대로 출력한다.

 

맨 마지막 return값에 +를 넣는 이유도 참 난감하다. mongodb에 데이터들이 들어갈텐데, 시간대별로 정렬을 할라고 했더니 date 섹션에 날짜와 시간이 섞여 있으니까 정렬도 제대로 안 되는 것이다. 역시 개발은 쉬운게 아니다. 뭘 해결하면 또 뭐가 나오고 또 뭘 해결하면 또 뭐가 나온다..

 

이것 때문에 또 여러가지를 찾아보았지만 뾰족한 수가 없어, 정렬할 때 특수기호는 우선순위가 숫자와 다르다는 특성을 이용해 그냥 날짜쪽에는 무조건 특수기호 +를 넣기로 했다. 그렇게 하니 일단 정렬은 잘 되었다. 근데 이것은 미봉책이고 좀 더 찾아봐야 할 것 같다.

 

아무튼, 겨우겨우 만들고 잘 작동하는걸 보니, 이게 또 느낌이 신기하다. 이맛에 개발자 하는건가?

 

 

+ Recent posts