python web crawler 질문입니다.

조회수 1219회

안녕하세요, 제가 아래의 웹페이지에서 각 장마다 절의 숫자를 얻을 수 있는 프로그램을 만들려고 합니다.

url = http://www.holybible.or.kr/B_NIV/cgi/bibleftxt.php?VR=NIV&VL=1&CN=1&CV=99

질문은 두가지입니다.

1) 각 장은, pagination이 되어있고 위의 url에서 VL의 숫자는 전체 책 66권의 숫자구요, CN은 각 책의 장의 숫자입니다. 예컨데, VL=20&CN=15 라면, 20번째 책의 15번째 장을 말하는 url이 되겠습니다. 하지만, 각 책은 장의 수가 다르고 만약 50장까지만 있는 책이라 하더라도 컨텐츠가 없는 51장 52장 53장의 url도 존재하는 것 같아서 고민입니다. ----------- word frequency 를 찾는 프로그램에서는 font class tkl 을 찾지 못하면 VL에 1을 더한다고 해놨는데, 이경우엔 어떻게 해결 해야 할지 모르겠습니다.

2) 절의 갯수 역시 각 장마다 달라서 이를 어떻게 추출 할 수 있을지요?? 각 책마다 전체 절수는 각 장의 절수를 다 더하면 되겠지만... 감이 안잡히네요 ㅎㅎ

도움 주시면 감사하겠습니다.

장 수를 세는 코드는 이렇게 짰었는데, 혹시 참고가 될까 첨부합니다. 감사합니다.

import requests
import re


def chapter_counter(max_book):
    min_book = 1
    while min_book <= max_book:
        page = requests.get("http://www.holybible.or.kr/B_NIV/cgi/bibleftxt.php?VR=NIV&VL={}&CN=1&CV=99".format(min_book))
        contents = str(page.content)
        chapter = max(int(i) for i in re.findall(r'>(\d+)</[ab]>&nbsp;', contents))
        w = re.search(r'(?<=height=12>\s<b>)(\d+\s)?[a-zA-Z]+', contents).group()
        print(w, '-', chapter, 'chapters')
        min_book += 1

chapter_counter(10)
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • requests, beautifulsoup, html5lib 3가지 모듈이 필요합니다.

    import requests
    import bs4
    
    def main():
        html = requests.get('http://www.holybible.or.kr/B_NIV/cgi/bibleftxt.php?VR=NIV&VL=40&CN=8&CV=99').content
        bs = bs4.BeautifulSoup(html, 'html5lib')
    
        pageTD = bs.findAll('td', attrs={'align':'center', 'class':'tk3'})[0]   # 페이징 문단
        lastChapter = pageTD.findChildren('a')[-2].text                         # 페이징 문단내 뒤에서 2번째 링크가 마지막 장이다.
    
        ol = bs.findAll('ol')   # 문단
        '''
        ol 태그의 start 속성이 문단의 시작 값 ex) 1 6 11 16 ...
        마지막 ol태그의 start 속성값과 ol 태그내 li(절) 갯수을 합하고 1을 빼준다.
        '''
        sectionCnt = int(ol[-1].attrs['start']) + len(ol[-1].findAll('li')) - 1
    
        print('해당성경의 마지막장: {0}\n해당장의 절수: {1}'.format(lastChapter, sectionCnt))
    if __name__ == '__main__':
        main()
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)