美文网首页Python技巧大全
个人成长秘籍之三,每天用Python强迫自己看两页书

个人成长秘籍之三,每天用Python强迫自己看两页书

作者: DigiHacker | 来源:发表于2020-02-07 20:47 被阅读0次
    Snipaste_2020-02-07_20-13-16.jpg
    昨天的文章中提到最常用的epub电子书其实是个zip压缩文件,而且已经拿到了书名和作者名,那今天我们就直接取出书的内容。

    epub文件里除了opf文件存放书的相关信息外,还有一个ncx文件存放了目录结构,它的内容类似这样

    <?xml version='1.0' encoding='utf-8'?>
    <ncx xmlns="/z3986/2005/ncx/" version="2005-1" xml:lang="zho">
      <head>
        <meta content="4" name="dtb:depth"/>
      </head>
      <docTitle>
        <text>书名</text>
      </docTitle>
      <navMap>
        <navPoint class="chapter" id="num_1" playOrder="1">
          <navLabel>
            <text>前言</text>
          </navLabel>
          <content src="part0001.html"/>
        </navPoint>
        <navPoint class="chapter" id="num_2" playOrder="2">
          <navLabel>
            <text>扉页</text>
          </navLabel>
          <content src="part0002.html"/>
        </navPoint>
    

    英文好的同学又能一眼看出它的结构了。其它的我们先不管,navMap就是导航地图的缩写,navPoint就是章节,content的src就是每页的html文件。了解这点就足够,没必要读xml和dtd等这些信息,xpath直接搞定

     def extract_outline(self, f):
        with self.book.open(f) as ncx:
    
          try:
            c = ncx.read().decode('utf-8')
            c = c.replace('\n', '').encode('utf-8')
            self.outline_file = etree.HTML(c)
    
            outlines = self.outline_file.xpath('//navpoint')
            for o in outlines:
              chapter = o.find('navlabel').find('text').text
              if chapter:
                self.outline[chapter] = o.find('content').get('src')
          except Exception as e:
            print(e)
    

    lxml似乎对xml比较挑剔,用xpath拿不到结果。好在它也支持html,用小写的navpoint就可以取到所有的章节了。我们存放在一个dict里就好。下面就是遍历这个dict,在zip里找到对应的文件。但按道理来说,我们应该回到opf文件,找到对应的目录,然后去找。但最近老不出门,小编比较暴躁。反正一本书就是那些页面,我不相信有重复文件,直接遍历下文件列表,只要文件名相同,就肯定是了。

      def get_page(self, page_num):
        page = list(self.outline.keys())[page_num - 1]
        for f in self.book.filelist:
          if self.outline[page] == f.filename.split('/')[-1]:
            with self.book.open(f) as p:
              html = etree.HTML(p.read().decode('utf-8').replace('\n', '').encode('utf-8'))
              for e in html.xpath('//*'):
                if e.text:
                  print(e.text)
    

    page_num不应该大于目录dict()的大小,找到对应文件后,可以直接返回html,也可以象我一样用lxml转成text

    回到主题,如何强迫自己看书呢。象上次我在这篇文章里讲的那样,建一个计划任务,每天发送两章到自己的邮箱就好了, 强迫症的你肯定不会允许未读邮件的存在吧。

    相关文章

      网友评论

        本文标题:个人成长秘籍之三,每天用Python强迫自己看两页书

        本文链接:https://www.haomeiwen.com/subject/wiyvxhtx.html