파이썬으로 전자책(epub) 읽고 쓰기

반응형
    반응형

    파이썬으로 전자책 추출이 된다고?

    파이썬으로 전자책을 읽고 쓰는 라이브러리를 소개할까 합니다. 전자책은 뷰어로 보면 되는데 굳이? 라는 생각이 들 수 있으나 이것도 데이터로 생각하면 전자책도 좋은 자원이라서 자연어 처리를 하는 용도로써 사용해보는 것도 좋을 것 같습니다.

    이건 연습용입니다. 남의 저작권을 가져다가 상업용으로 쓰려면 그에 대한 저작권 협의가 있어야 함을 꼭 명심하셨으면 좋겠습니다.

    ebooklib

    epub는 일반적으로 xml이 압축된 형태로 파일의 형태를 잘 이해하고 있다면 zip을 이용해 압축해제를 해서 어찌어찌 할 수 있는데 약간 복잡합니다. 이런 걸 이미 ebooklib라는 라이브러리를 통해 할 수 있게 되었습니다.
    몇 줄의 코드로 epub파일을 불러올 수 있습니다.

    설치는 간단합니다.

    pip install ebooklib

    epub 읽기

    ebooklib의 역할은 압축되어있는 epub를 분해해주는 역할입니다. 분해하면 보통 xhtml형태로 분해가 되기 때문에 beautifulsoup을 이용해 불러오면 됩니다.

    
    import ebooklib
    from ebooklib import epub
    ## 책 읽기
    book = epub.read_epub(r"책이름.epub")
    items = list(book.get_items_of_type(ebooklib.ITEM_DOCUMENT))
    
    texts = []
    for i, item in enumerate(items):
        texts.append(item)
    
    # texts 에는 html 목록이 나열되어있음
    # Beautifulsoup로 부르기
    
    from bs4 import BeautifulSoup
    
    text = []
    for i in texts:
        soup = BeautifulSoup(i.get_body_content(),'html.parser')
        text = [p.get_text() for p in soup.find_all('p')]
        ' '.join(text)
    
    print(text)

    epub 쓰기

    html형식으로 써야하지만 어쨋든 써집니다.
    가이드 사이트에 있는 예제인데 약간 변형해봤습니다.

    # 책 쓰기
    from ebooklib import epub
    
    book = epub.EpubBook()
    
    # set metadata
    book.set_identifier("id123456")
    book.set_title("Sample book")
    book.set_language("en")
    
    book.add_author("Author Authorowski")
    book.add_author(
        "Danko Bananko",
        file_as="TEST",
        role="ill",
        uid="coauthor",
    )
    
    # create chapter(그림과 글 넣기)
    c1 = epub.EpubHtml(title="Intro", file_name="chap_01.xhtml", lang="hr")
    c1.content = (
        "<h1>Intro heading</h1>"
        "<p>Zaba je skocila u baru.</p>"
        #'<p><img alt="[ebook logo]" src="static/ebooklib.gif"/><br/></p>'#
    ) 
    
    # create image from the local image
    # image_content = open("ebooklib.gif", "rb").read()
    # img = epub.EpubImage(
    #     uid="image_1",
    #     file_name="static/ebooklib.gif",
    #     media_type="image/gif",
    #     content=image_content,
    # )
    
    # add chapter
    book.add_item(c1)
    # add image
    #book.add_item(img)
    
    # define Table Of Contents
    book.toc = (
        epub.Link("chap_01.xhtml", "Introduction", "intro"),
        (epub.Section("Simple book"), (c1,)),
    )
    
    # add default NCX and Nav file
    book.add_item(epub.EpubNcx())
    book.add_item(epub.EpubNav())
    
    # define CSS style
    style = "BODY {color: white;}"
    nav_css = epub.EpubItem(
        uid="style_nav",
        file_name="style/nav.css",
        media_type="text/css",
        content=style,
    )
    
    # add CSS file
    book.add_item(nav_css)
    
    # basic spine
    book.spine = ["nav", c1]
    
    # write to the file
    epub.write_epub("test.epub", book, {})

    마치며

    아직 이것저것 시도를 해봐야겠지만 뭔가 쉽지 않은 느낌은 확 나네요. 그래도 필요하다면 ebooklib로 어찌어찌 해야겠습니다.

     

    함께보면 좋은글

    파이썬으로 PDF 불러오기,병합하기

     

    댓글

    Designed by JB FACTORY

    ....