파이썬 데이터프레임에서 숨겨진 자료 찾기와 관련된 질문입니다.

조회수 563회
import pandas as pd
import requests
from bs4 import BeautifulSoup
from datetime import datetime

# code 설정
code = '005930'

# 무위험이자율 계산
ke_url = "https://www.kisrating.com/ratingsStatistics/statics_spread.do"
ke_res = requests.get(ke_url)
ke_df = pd.read_html(ke_res.text)
ke = float(ke_df[0].iloc[10, 8])


# 자료를 가져오는 영역 : snapshot과 재무제표만 가져오기
snapshot_url = "http://comp.fnguide.com/SVO2/ASP/SVD_Main.asp?pGB=1&gicode=A{}&cID=&MenuYn=Y&ReportGB=&NewMenuID=101&stkGb=701".format(code)
snapshot_res = requests.get(snapshot_url)
snapshot_df = pd.read_html(snapshot_res.text)

fs_rpt_url = "http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode=A{}&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701".format(code)
fs_rpt_res = requests.get(fs_rpt_url)
fs_rpt_df = pd.read_html(fs_rpt_res.text)

# 해당자료에서 NAN값을 0으로 바꾸는 작업
for i in range(len(snapshot_df)):
    # snapshot_df[i] = df[i].apply(pd.to_numeric, errors = 'coerce') # 이건 매우 중요하다. 이걸 적용하면 문자로 된건 전부 Nan 값이 된다.
    snapshot_df[i].fillna(0,inplace=True)

for i in range(len(fs_rpt_df)):
    # fs_rpt_df[i] = df[i].apply(pd.to_numeric, errors = 'coerce') # 이건 매우 중요하다. 이걸 적용하면 문자로 된건 전부 Nan 값이 된다.
    fs_rpt_df[i].fillna(0,inplace=True)

# fs_rpt_df[0] : 연결 손익계산서(연간)
# fs_rpt_df[1] : 연결 손익계산서(분기)
# fs_rpt_df[2] : 연결 손익계산서
print(fs_rpt_df[0].iloc[3, 0])

안녕하세요 파이썬 초보가 질문 드립니다.

제가 데이터를 스크랩핑하는 과정에서 숨겨진 데이터가 있어서 글을 올립니다.

코드를 실행하면 "판매비와관리비계산에 참여한 계정 펼치기" 라는 항목이 뜨는데요,

이게 실제 웹페이지에서는

"판매비와관리비 +"로 표시된 것입니다.

+버튼 눌렀을 때 나오는 자료가 필요한데 이건 어떻게 해야 가져올 수 있을까요?

답변 주시면 감사하겠습니다.

이미지

아 그리고 항상 답변 올려주시는 모든 분들께 감사드립니다.~ ^^

1 답변

  • 좀 운이 좋은 케이스 같은데, 해당 페이지 소스 자체를 받아보면 이런 식으로 되어 있습니다.

    <tr id="p_grid1_4" class=" rwf acd_dep_start_close ">
        <th scope="row" class="l clf">
            <div class=""><span class="txt_acd">판매비와관리비</span><a id="grid1_4" href="javascript:foldOpen('grid1_4');" class=" btn_acdopen"><span class="blind" id="span_grid1_4">계산에 참여한 계정 펼치기</span></a></div>
        </th>
        <td class="r">566,397</td>
        <td class="r">524,903</td>
        <td class="r">553,928</td>
        <td class="r">416,252</td>
        <td class="r">412,229</td>
        <td class="r cle">1.0</td>
    </tr>
    <tr  class="c_grid1_4 rwf acd_dep2_sub" style="display:none;">
        <th scope="row" class="l clf">&nbsp;&nbsp;&nbsp;인건비</th>
        <td class="r">67,972</td>
        <td class="r">64,514</td>
        <td class="r">64,226</td>
        <td class="r">51,701</td>
        <td class="r">49,271</td>
        <td class="r cle">4.9</td>
    </tr>
    

    문제의 행은 DOM에는 존재하고, 다만 인라인 CSS를 통해 단순히 숨겨져 있음을 알 수 있죠. javascript:foldOpen('grid1_4')이 하는 일이 무엇일지는 너무나 명확하고요.

    그냥 rwf 클래스를 갖는 tr을 다 찾아서 순회하면서 파싱하시면 될거 같네요.
    그 안의 첫번째 th의 텍스트 내용이 뭐냐를 가지고 처리를 분기하시면 될 듯합니다.

    • 답변감사드립니다. 그런데 혹시 fs_rpt_df[0] 이런 상태(확인해보니 이건 데이터 프레임이던데요)에서 가져올 방법은 없을까요? 알 수 없는 사용자 2021.2.6 22:55
    • 글쎄 거기서부터는 좀 다른 문제 같고 제가 잘 모르겠습니다. 엽토군 2021.2.6 23:17
    • 네 감사합니다.~~ 알 수 없는 사용자 2021.2.7 00:02

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)