TypeError:迭代非序列

时间:2013-01-29 14:16:18

标签: python xml-parsing lxml epub

我在这里看了很多帖子以及谷歌搜索。我已经使用过其他语言,但仍在学习Python,而且我也不熟悉课程,所以我觉得我只是对课程的行为方式不了解。

我想开发一个epub阅读应用程序并发现roberto alasina的项目称为集成,它是一个很好的起点,但它没有收集元数据,而且epub处理库也没有提取到其他一些东西我想做。所以我找到了一个epub阅读课的dustjacket。

我需要进一步提取这个的原因是我需要处理来自应用程序的多个部分而不仅仅是阅读器本身的数据读取。我计划添加whoosh以启用搜索和索引,我将需要阅读章节,然后索引文件。我可以在导入本书时执行此操作,并且实际上不需要gui来实现索引部分。

无论如何,我已经添加了日志记录,我可以看到我的方法正确地抓取了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

我现在不知道我做错了什么以及为什么这不起作用。如果这还不够,我可以发布我正在使用的其他类。

由于

1 个答案:

答案 0 :(得分:0)

正如您所示,您的问题就在于这一行:

for l, c in self.__toc:

但是自我.__ toc被宣布为:

self.__toc = EpubToc(self)

底线是,您需要遍历列表而不是对象。这样的东西应该可以工作,你可能需要做一些调整才能让它适合你的特定需求(例如拉链功能)

for c in self.__toc.get_chapter_titles():