как разобрать текст из каждой главы в epub? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь проанализировать и преобразовать контент из книг в формате 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 - это функция, которую я пытаюсь использовать, в настоящее время она работает для первых двух глав, а затем с треском запускается. я просто хочу иметь возможность получить весь текст из каждой главы в соответствующие списки. Большое спасибо. Я собираюсь продолжать работать над этим. Если вы можете предложить какую-либо помощь или совет, это будет с благодарностью.

1 Ответ

0 голосов
/ 02 июня 2019

нашел решение, создал индекс, используя заголовки глав, из которых начинаются главы, и сохранил его в кортеже.затем использовал этот кортеж для перебора содержимого и добавления всего содержимого в соответствующие главы.Надеюсь, что это поможет следующему человеку, который хочет разобрать epubs.если у кого-нибудь есть предложения, пожалуйста, дайте мне знать.о разборке epub в Интернете не так много информации.

...