0

私はここでこれに関するかなりの数の投稿を調べ、それをグーグルで調べました。私は他の言語を使用しましたが、まだPythonを学んでおり、クラスにもあまり詳しくないので、クラスの動作について理解していないことに気付いていると思います。

私はePub読書アプリで作業したかったのですが、integrateというroberto alasinaのプロジェクトを見つけました。これは良い出発点でしたが、メタデータが収集されず、ePub処理ライブラリが他のいくつかのことに対して十分に抽出されていません。 。そこで、ePubの読書クラスであるダストジャケットを見つけました。

これをさらに抽出する必要がある理由は、リーダー自体だけでなく、アプリの複数の部分からのデータの読み取りを処理する必要があるためです。検索を可能にするためにwhooshを追加する予定です。インデックスを作成するには、章を読んでからファイルにインデックスを作成する必要があります。私は本のインポート中にこれを行うことができ、実際のインデックス作成部分のGUIは実際には必要ありません。

とにかくdistジャケットでロギングを追加しましたが、私のメソッドがePubから目次を正しく取得していることがわかります。

    def __parse_oebps(self, epub):
    '''Construct the chapter list assuming that the ePub has files in OEBPS/.'''

    # Parse the chapters
    npoints = self.__toc.findall("//{%(tocns)s}navPoint" % {'tocns': self.__namespaces['ncx']})
    for p in npoints:                   
        #rt = p.getroottree()
        #title = p.findtext("{%(tocns)s}text" % {'tocns': self.__namespaces['ncx']}) # Label text           
        title = p.find(
            '{http://www.daisy.org/z3986/2005/ncx/}navLabel').find(
                '{http://www.daisy.org/z3986/2005/ncx/}text').text
        contentfile = p.find("{%(tocns)s}content[@src]" % {'tocns':self.__namespaces['ncx']}).attrib['src'] # Contentfile name
        #if self.__has_oebps:
        #   #contentfile = "OEBPS/" + contentfile
        #   contentfile = "OEBPS/" + contentfile
        #   log.info("content file: %s", contentfile)

        #return contentfile 
        #self.chapters.append(EpubChapter(epub, p.attrib['id'], p.attrib['playOrder'], contentfile, title))
        if title and contentfile:
            log.debug("Title:        %s", title)
            log.debug("content file: %s", contentfile)
            self.chapters.append([title, contentfile])

    return self.chapters

デバッグログを挿入すると、インスタンスがクラスから適切に呼び出され、タイトルとコンテンツファイルがそこにあることが簡単にわかります。これはebubtocクラスからのものであり、epubクラスのこのメソッドから呼び出されます。

    def __read_toc(self):
    '''Construct the table of contents for this epub'''
    self.__toc = EpubToc(self)
    for l, c in self.__toc:
        log.debug("Title:        %s", l)
        log.debug("content file: %s", c)

このメソッドがそのデータを取得するのは、次のエラーが発生するときです。

    for l, c in self.__toc:
TypeError: iteration over non-sequence

現時点では、何が間違っているのか、なぜこれが機能しないのかわかりません。これで十分でない場合は、使用している残りのクラスを投稿できます。

ありがとう

4

1 に答える 1

0

あなたが示すように、あなたの問題はこの行です:

for l, c in self.__toc:

しかし、self.__tocは次のように宣言されました。

self.__toc = EpubToc(self)

つまり、オブジェクトではなく、リストを反復処理する必要があります。このようなものは機能するはずですが、特定のニーズ(たとえば、zip機能など)で機能させるには、少し調整が必要になる場合があります。

for c in self.__toc.get_chapter_titles():
于 2013-01-29T14:28:00.723 に答える