個人成長秘籍之三,每天用Python強迫自己看兩頁書

Snipaste_2020-02-07_20-13-16.jpg

昨天的文章中提到最常用的epub電子書其實是個zip壓縮文件,而且已經(jīng)拿到了書名和作者名,那今天我們就直接取出書的內(nèi)容。

epub文件里除了opf文件存放書的相關(guān)信息外,還有一個ncx文件存放了目錄結(jié)構(gòu),它的內(nèi)容類似這樣

<?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>

英文好的同學(xué)又能一眼看出它的結(jié)構(gòu)了。其它的我們先不管,navMap就是導(dǎo)航地圖的縮寫,navPoint就是章節(jié),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拿不到結(jié)果。好在它也支持html,用小寫的navpoint就可以取到所有的章節(jié)了。我們存放在一個dict里就好。下面就是遍歷這個dict,在zip里找到對應(yīng)的文件。但按道理來說,我們應(yīng)該回到opf文件,找到對應(yīng)的目錄,然后去找。但最近老不出門,小編比較暴躁。反正一本書就是那些頁面,我不相信有重復(fù)文件,直接遍歷下文件列表,只要文件名相同,就肯定是了。

  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不應(yīng)該大于目錄dict()的大小,找到對應(yīng)文件后,可以直接返回html,也可以象我一樣用lxml轉(zhuǎn)成text

回到主題,如何強迫自己看書呢。象上次我在這篇文章里講的那樣,建一個計劃任務(wù),每天發(fā)送兩章到自己的郵箱就好了, 強迫癥的你肯定不會允許未讀郵件的存在吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容