bs4 의 웹스크레이핑 find_all에서 list index out of range 질문입니다.
조회수 539 답변수 1 반응수 2 등록일 2019.04.10 12:47:33

  1. res = requests.get('https://finance.naver.com/item/coinfo.nhn?code=005930')
  2. soup = bs4.BeautifulSoup(res.content,'html.parser')
  3. tables_array=soup.find_all('table',{'class' : 'gHead01 all-width'})[0]
  4. print(type(tables_array))
  5. #tables_array.prettify()
  6. #table0_body=tables_array.find_all("tr")[0]
  7. #print(type(table0_body[0]))
  8.  

웹스크레이핑 초보입니다.

1>[0]을 find_all 다음에 안 붙이니 그냥 빈데이터가 나옵니다. 

그래서 [0]으로 재무 테이블을 추출하려고 하는데 그러니 선택되는게 없네요

html구조는 여러 테이블이 저 페이지에 있고 

저 클래스를 가진 테이블도 여러개 있는데 

그 안에 tbody> tr> td> span순으로 되어 

span의 텍스트 추출을 하고 싶습니다. 


2> 1>이 안되면 id로도 찾아야 할까요?


3>그리고 처음 tables_array를 prettify하면 왜 안 될까요?

반갑습니다. 바카스크님.


빈 데이터가 반환되는 이유는 res.content 안에 정말로 찾으려는 요소가 없기 때문입니다. 재무테이블은 페이지 내에서 Iframe을 사용하여 다른 HTML을 삽입하고 있습니다. 

그렇기 때문에 requests.get에는 Iframe 태그의 src 속성으로 가져와야 합니다. 페이지소스를 확인해보면 재무테이블을 삽입하는 Iframe src 속성은 "https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=005930" 임으로

아래처럼 requests.get의 인자를 변경하면 값을 반환받을 수 있습니다.

  1. import requests
  2. import bs4
  3.  
  4. res = requests.get('https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=005930')
  5. soup = bs4.BeautifulSoup(res.content, 'html.parser')
  6. tables_array = soup.find_all('table', {'class': 'gHead01 all-width'})

또 다른 방법은 selenium 라이브러리를 사용하는 방법이 있습니다.


prettify()는 싱글 아이템이어야 합니다. find_all 메소드는 값을 리스트로 반환해주기 때문에 에러가 발생하게 됩니다.


문제를 해결하셨다면 채택 부탁드릴게요.

좋은밤 되세요!

2019.04.11 00:08:40 반응 이력
저도 바카스크님과 같이 크롬의 검사에서 확인했었어요. requests.get 메소드가 iframe을 가져오지 못한다는 걸 인지한 상태에서 크롬 검사로 해당 엘리먼트의 상위 노드를 보니 iframe이었구요. 코닝구 2019.04.13 00:04:30
감사합니다! 근데 Iframe을 사용한 것인지는 어떻게 판단을 하는 건지요? 제 크롬 검사에서는 tr데이터들이 다 보이는데 이게 셀레니엄이 필요한 동적 데이터라는 것은 알지만 어떻게 판단해서 iframe에서 받아온 것인지 아시게 된 방법도 여쭤보고 싶습니다:) 감사합니다 바카스크 2019.04.11 18:51:47

삭제된 댓글입니다.

답변 작성

질문에 적합한 답변을 상세히 작성해 주시기 바랍니다.

답변이 찬성되면 태그평판 +2점이 적립, 반대되면 태그평판 -1점 차감됩니다.

답변이 채택되면 태그평판 +10점이 적립됩니다.

python 게시판 정보
  • 9
    질문수
  • 30
    아카이브수
  • 7
    채택수
  • 2
    멤버수
python 질문 통계
최근 30일
답변율
0%
채택율
0%
전체
답변율
44%
채택율
77%