Я пытаюсь проанализировать и преобразовать контент из книг в формате epub в мою собственную структуру, но у меня возникают проблемы с обнаружением и извлечением всего текста между каждой главой. Как я могу это сделать?
вот два файла epub, над которыми я хочу работать, и, в конечном итоге, над другими: http://www.gutenberg.org/ebooks/11.epub.noimages?session_id=f5b366deca86ee5e978d79f53f4fcaf1e0ac32ca
http://www.gutenberg.org/ebooks/98.epub.noimages?session_id=f5b366deca86ee5e978d79f53f4fcaf1e0ac32ca
Я могу получить название каждой главы в словаре следующим образом:
{'ALICE’S ADVENTURES IN WONDERLAND': [], 'THE MILLENNIUM FULCRUM EDITION 3.0': [], 'Contents': [], 'CHAPTER I. Down the Rabbit-Hole': [], 'CHAPTER II. The Pool of Tears': [], 'CHAPTER III. A Caucus-Race and a Long Tale': [], 'CHAPTER IV. The Rabbit Sends in a Little Bill': [], 'CHAPTER V. Advice from a Caterpillar': [], 'CHAPTER VI. Pig and Pepper': [], 'CHAPTER VII. A Mad Tea-Party': [], 'CHAPTER VIII. The Queen’s Croquet-Ground': [], 'CHAPTER IX. The Mock Turtle’s Story': [], 'CHAPTER X. The Lobster Quadrille': [], 'CHAPTER XI. Who Stole the Tarts?': [], 'CHAPTER XII. Alice’s Evidence': []}
Я хочу добавить текст между каждой главой в этот список, но у меня много проблем
Вот как я могу получить главу:
import sys
import lxml
import ebooklib
from ebooklib import epub
from ebooklib.utils import debug
from lxml import etree
from io import StringIO, BytesIO
import csv, json
bookJSON = {}
chapterNav = {}
chapterTitle = {}
chapterCont = {}
def parseNAV(xml):
"""
Parse the xml
"""
root = etree.fromstring(xml)
for appt in root.getchildren():
for elem in appt.getchildren():
#print(elem.tag)
for child in elem.getchildren():
#print(child.tag)
if("content" in child.tag):
srcTag = child.get("src")
#print(child.tag + " src: " + srcTag)
contentList = srcTag.split("#")
#print(contentList[1])
chapterNav[contentList[1]] = text
chapterTitle[text.strip()] = []
chapterCont[text.strip()] = []
for node in child.getchildren():
if not node.text:
text = "None"
else:
text = node.text
#print(node.tag + " => " + text)
#print(elem.tag + " CLOSED" + "\n")
def parseContent(xml):
"""
Parse the xml
"""
root = etree.fromstring(xml)
chaptText = []
chapter= ''
for appt in root.getchildren():
for elem in appt.getchildren():
if(elem.text != None and stringify_children(elem) != None):
if("h2" in elem.tag):
print(stringify_children(elem))
if (elem.text).strip() in chapterTitle.keys():
chapterCont[elem.text.strip()] = chaptText
chaptText = []
else:
chaptText.append(stringify_children(elem))
def stringify_children(node):
return (''.join(node.itertext()).strip()).replace("H2 anchor","")
book = epub.read_epub(sys.argv[1])
# debug(book.metadata)
def getData(id,book,bookJSON):
data = list(book.get_metadata('DC', id))
if(len(data) != 0):
bookJSON[id] = []
for x in data:
dataTuple = x
bookJSON[id].append(str(dataTuple[0]))
return bookJSON
return bookJSON
bookJSON = getData('title',book,bookJSON)
bookJSON = getData('creator',book,bookJSON)
bookJSON = getData('identifier',book,bookJSON)
bookJSON = getData('description',book,bookJSON)
bookJSON = getData('language',book,bookJSON)
bookJSON = getData('subject',book,bookJSON)
nav = list(book.get_items_of_type(ebooklib.ITEM_NAVIGATION))
navXml = etree.XML(nav[0].get_content())
#print(nav[0].get_content().decode("utf-8"))
parseNAV(etree.tostring(navXml))
print(bookJSON)
bookContent = list(book.get_items_of_type(ebooklib.ITEM_DOCUMENT))
for cont in bookContent:
contentXml = etree.XML(cont.get_content())
parseContent(etree.tostring(contentXml))
# print(chapterCont)
# print(chapterNav)
# print(chapterTitle)
ParseContent - это функция, которую я пытаюсь использовать, в настоящее время она работает для первых двух глав, а затем с треском запускается. я просто хочу иметь возможность получить весь текст из каждой главы в соответствующие списки. Большое спасибо. Я собираюсь продолжать работать над этим. Если вы можете предложить какую-либо помощь или совет, это будет с благодарностью.