파이썬으로 전자책(epub) 읽고 쓰기
- 카테고리 없음
- 2023. 8. 10.
반응형
반응형
파이썬으로 전자책 추출이 된다고?
파이썬으로 전자책을 읽고 쓰는 라이브러리를 소개할까 합니다. 전자책은 뷰어로 보면 되는데 굳이? 라는 생각이 들 수 있으나 이것도 데이터로 생각하면 전자책도 좋은 자원이라서 자연어 처리를 하는 용도로써 사용해보는 것도 좋을 것 같습니다.
이건 연습용입니다. 남의 저작권을 가져다가 상업용으로 쓰려면 그에 대한 저작권 협의가 있어야 함을 꼭 명심하셨으면 좋겠습니다.
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로 어찌어찌 해야겠습니다.
함께보면 좋은글