惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
B
Blog
博客园_首页
博客园 - 司徒正美
有赞技术团队
有赞技术团队
博客园 - 聂微东
I
InfoQ
美团技术团队
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
个人成长秘籍之三,每天用Python强迫自己看两页书 - 少数派
2020-02-07 · via 少数派

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

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