加载中…
个人资料
烦得多
烦得多
  • 博客等级:
  • 博客积分:0
  • 博客访问:590,274
  • 关注人气:177
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

使用calibre多卷抓取《随园食单》

(2016-02-27 22:34:41)
标签:

calibre

recipe

网页抓取

epub生成

python

分类: 电子书制作
网上看了【教程】使用Calibre抓取网页电子书一文,再看原来的页面,总觉得有一种不舒服的感觉。如图所示:使用calibre多卷抓取《随园食单》
网上原来的《随园食单》由“总序”、“须知单”、“戒单”、“海鲜单”、“特性单”、“杂性单”、“羽族单”、“水族无鳞单”八卷组成,而经过那位网友抓取后。就成了没有分隔的一卷了。原来书每卷的分类全无,如图。
使用calibre多卷抓取《随园食单》

让人有种吃了苍蝇有感觉。于是参考了一下张洋的抓取网页内容生成Kindle电子书》的一文,学习了一下calibre的recipe中parse_index返回值的数据结构,原来自己阅读calibre的recipe的apiBasicNewsRecipe源码,以及Adding your favorite news website都没有发现parse_index返回值的数据结构有多卷的,但张洋那篇博文中描述的确有多卷的结构,如图:
使用calibre多卷抓取《随园食单》
按照这个结构,重写了一下抓取《随园食单》的recipe,使用两个循环,第一个for分卷,生成卷标题,第二个for生成本卷article,即(title,url)(图中的map)的list(图中的Chapters),然后加上卷标题,生成volume(图中的Tuple),通过append把各卷组合成ans0,即图中的book(List),返回这个值。
源码如下:
# coding=gbk
from calibre.web.feeds.recipes import BasicNewsRecipe

class Suiyuanshidan(BasicNewsRecipe):
   title = u"随园食单"
   description = u"本书是清朝袁牧的代表作,,书中不仅蕴涵了这位大散文家对饮食的理解,也包含了他对生活品位的独特评价和独到见地,读来风趣而有文采。此外,书中还收录了中国传统饮食文化的其他经典,诸如:宋代林洪的《山家清供》,清代李渔的《闲情偶寄》,,元代倪瓒的《云林堂饮食制度集》等,读来别有一番滋味,而且颇有收藏价值。"
   cover_url = "http://image4.club.sohu.com/lz_images/data/book/95/6695/6695.icon.gif"
   url_prefix = "http://lz.book.sohu.com"
   no_stylesheets = True
   keep_only_tags = [{'class':'book_con'}]  #要保留的标签
   def get_title(self,link):
       return link.contents[0].strip()
   def parse_index(self):
       soup = self.index_to_soup('http://lz.book.sohu.com/book-6695.html')
       ans0 = []
       for div in soup.findAll('div',{'class':'lc_con1'}):  
          hi = div.find('h2')
          til_vol = hi.contents[0].strip()
          til_vol = til_vol.encode("utf-8")
          articles = []
          for link in div.findAll('a',target="_blank"):
             if 'http' in link['href']:
                continue
             title = self.get_title(link)
             title = title.encode("utf-8") 
             title1 = title[19:]            
             url = self.url_prefix +link['href']
             a = {'title':title1,'url':url}
             articles.append(a)
          if len(articles) > 0 :  #原网页中有几个空标题,这里跳过,也不再出现多两级的问题,不再要编辑epub
             ans = (til_vol,articles)
             ans0.append(ans)
   return ans0
代码中基本保留了原文的多数内容。只是实现了多卷的抓取。
结果如图:
使用calibre多卷抓取《随园食单》

已经保留了多卷的结构。缺点是每卷原来的说明不能体现,美中不足。查了一下,好像结构中不支持每卷标题还有text,只能如此了。
本文实现了张洋图中提出的多卷抓取,为大家以后对多卷书的处理提供了一个方法。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有