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

2020-02-07 20:51:28 2点赞 14收藏 0评论

昨天的<文章>中提到最常用的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

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

未经授权,不得转载
展开 收起

Amazon 亚马逊 全新Kindle Paperwhite 4 电子书阅读器

Amazon 亚马逊 全新Kindle Paperwhite 4 电子书阅读器

556.35元起

Kindle paperwhite4 电子书阅读器 黑色 8G

Kindle paperwhite4 电子书阅读器 黑色 8G

888元起

MI 小米 小米多看电纸书 电子阅读器 深灰色 16GB

MI 小米 小米多看电纸书 电子阅读器 深灰色 16GB

525元起

JDRead1 电子书阅读器 300ppi 高清墨水屏 电纸书 6英寸 阅读灯

JDRead1 电子书阅读器 300ppi 高清墨水屏 电纸书 6英寸 阅读灯

958元起

全新Kindle oasis尊享版电子书阅读器 32G银灰色永乐宫联名定制礼盒-福虎笙风

全新Kindle oasis尊享版电子书阅读器 32G银灰色永乐宫联名定制礼盒-福虎笙风

2888元起

文石BOOX Note Pro 纯平电子书阅读器 10.3英寸智能书写阅读 墨水屏电纸书 64G 黑色

文石BOOX Note Pro 纯平电子书阅读器 10.3英寸智能书写阅读 墨水屏电纸书 64G 黑色

3080元起

掌阅iReader A6 电子书阅读器 6英寸电纸书 听读一体蓝牙听书墨水屏8GB 星耀蓝

掌阅iReader A6 电子书阅读器 6英寸电纸书 听读一体蓝牙听书墨水屏8GB 星耀蓝

1068元起

Kindle Paperwhite 4 电子书阅读器 8G 锦读纯黑套+199礼包

Kindle Paperwhite 4 电子书阅读器 8G 锦读纯黑套+199礼包

998元起

博阅 likebook Mars 电子阅读器

博阅 likebook Mars 电子阅读器

950元起

OBOOK 国文 86G 当当阅读器light版 300ppi纯平防水墨水屏 33级阅读灯 (8G、黑色)

OBOOK 国文 86G 当当阅读器light版 300ppi纯平防水墨水屏 33级阅读灯 (8G、黑色)

768元起

OBOOK 国文 R7s 7.8英寸智能手写电子书阅读器 32G 玫瑰金

OBOOK 国文 R7s 7.8英寸智能手写电子书阅读器 32G 玫瑰金

1279元起

Kindle X咪咕 电纸书阅读器 电子书墨水屏6英寸wifi黑色(中小学版)

Kindle X咪咕 电纸书阅读器 电子书墨水屏6英寸wifi黑色(中小学版)

498元起

OBOOK 国文一本通3 10.3英寸电子书阅读器 16GB

OBOOK 国文一本通3 10.3英寸电子书阅读器 16GB

2399元起

当当阅读器8 电子书 阅读器 电纸书 超轻薄300ppi纯平水墨屏16G内存 月光白

当当阅读器8 电子书 阅读器 电纸书 超轻薄300ppi纯平水墨屏16G内存 月光白

918元起

BOOX BOOX Note2 10.3英寸纯平双触控电纸书

BOOX BOOX Note2 10.3英寸纯平双触控电纸书

3680元起

全新Kindle paperwhite 电子书阅读器 32G 永乐宫 瑞鹤衔福 联名定制礼盒

全新Kindle paperwhite 电子书阅读器 32G 永乐宫 瑞鹤衔福 联名定制礼盒

1388元起
0评论

发表评论请 登录
评论举报

请选择举报理由

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
14
扫一下,分享更方便,购买更轻松