본문 바로가기
개발

사이트의 HTML 문서 가져오기

by 박영귤 2023. 5. 31.

어떤 사이트든 HTML문서를 가져올 수 있다.

다음과 같이 requests.get(url)을 하면 그 응답이 담기게 되고, 에러가 없을 경우 .text를 하면 코드가 텍스트 형태로 담기게 된다.

.json을 하면 json형태로 담기는 것도 같은 방식이라고 생각한다.

 또한, BeautifulSoup라는 것을 이용하면 그 코드를 쉽고 간편하게 원하는 것만 가져올 수 있는 기능을 사용할 수 있다. 

soup = BeautifulSoup(response.text, 'html.parser')
shipping_result = soup.select_one('table.table_col > tbody > tr:first-child > td:last-child')

예를 들어 다음과 같이 작성한다면 html을 쉽게 파싱할 수 있다.

두 번째 문장이 무슨 의미냐 하면

1. class 이름이 table_col이라는 테이블을 찾는다.

  - #을 이용하면 id도 검색이 가능하다!

2. 그 코드 안에서 가장 가까이있는 tbody로 들어간다.

3. 첫 번째 tr로 들어간다.

4. 마지막 td로 들어간다.

 

    def getHanjinStatus(tracking_number):
        url = 'https://www.hanjin.com/kor/CMS/DeliveryMgr/WaybillResult.do'
        response = requests.post(url, data={'mCode':'MN038', 'wblnum':tracking_number,'schLang':'KR','wblnumtext':None})
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        shipping_result = soup.select_one('div.waybill-tbl > table > tbody > tr:last-child > td:last-child')
        
        if not shipping_result:
            print('shipping_result.text is empty')
            return None
            
        if any(s in shipping_result.text for s in ['배달완료','배송완료']):
            return 'complete'
        return 'shipping'

다음은 내가 오늘 짠 한진택배에서 특정 운송장의 배송 상태를 가져오는 함수이다.

먼저 https://www.hanjin.com/kor/CMS/DeliveryMgr/WaybillSch.do?mCode=MN038이 곳으로 post 요청한다. post로 넘겨줄 데이터의 형식은 f12를 누른 후 network에서 목록 중 맨 위의 것을 클릭한 후 payload를 살펴보면 알 수 있다. 형식을 맞추어 데이터를 넘겨주면 코드상으로 post요청을 하게 되는 것이다.

다음 빨간 화살표로 가리킨 부분이 왼쪽의 배송완료 부분이다.

따라서 shipping_result는 그냥 각 태그를 따라간 것이다.

beautiful soup를 잘 사용하면 좋을 것 같다.