지난 게시글에서 제작했던 코드가 만들어낸 결과물을 보면, 아래의 화면에서 찾아볼 수 있는 8개의 종목 외에도 더 많은 종목들이 출력되는 모습을 확인할 수 있다. 그 이유는 단순하다. 상한가 탭에 있는 8개의 종목에서 끝나지 않고 그 옆에 있는 하한가 탭, 상승 탭, 보합 탭, 하락 탭 모두에 접근하면서 종목명과 종목코드들을 불러오기 때문이다.
그렇다면 우리는 상한가 탭 내에 있는 종목만을 대상으로 자료를 뽑아내야 하는 절차가 필요하다. 다시 말해, 모든 데이터가 입력되어 있는 test_2 변수를 수정해야 하는 것이다.
태그 디테일하게 설정하기
다시 네이버 증권에 들어가서 사용하고자 하는 자료의 HTML 구조를 살펴보니 아래와 같이 <div class="box_type_l"> 태그의 하단 부분에는 <table summary="탑종목 상한가 리스트"> 뿐만 아니라 "탑종목 하한가 리스트", "탑종목 상승 리스트" 등 많은 탭들이 모두 포함되어 있음을 확인할 수 있다.
우리는 여기서 "탑종목 상한가 리스트" 하단부에 있는 데이터만 필요한 것이기 때문에, summary가 "탑종목 상한가 리스트"인 경우에만 데이터를 가져오도록 코드를 수정해주도록 하자. 다행히도, 위의 사진에서 파란색 부분을 보면 알 수 있듯이 "탑종목 상한가 리스트"에는 id="siselist_tab_0" 등과 같이 각각의 테이블마다 고유한 id 값이 부여되어 있다. 이 id값을 통해 그 안에 있는 내용을 불러와보자. id 값을 통해 해당 구간의 데이터를 찾는 방법은 아래 코드의 11번째 줄을 확인하도록 하자.
조금 첨언하자면, if문 하단에 test와 test_1, test_2로 구분되어 있는 부분은 아래와 같이 깔끔하게 정리할 수 있다. 여기서 수정 후의 코드와 같은 방식으로 수정하게 된다면 for문의 대상이 되는 변수 역시 test_2가 아닌 test_1으로 변경해주어야 한다.
## 기존 코드
test = bsObj.select_one('div.box_type_l')
test_1 = test.select_one('table', {'id':'siselist_tab_0'})
test_2 = test_1.select('td > a')
## 수정 코드
test = bsObj.select_one('div.box_type_l > table', {'id':'siselist_tab_0'})
test_1 = test.select('td > a')