Python 抓取「知识星球」内容生成电子书 (2)

我们主要解析其中的 owner.name 和 text,其他信息我们暂时不关心,比如是对谁谁谁的回复,我们暂时只把评论列举出来。

# 评论解析 comments = topic.get('show_comments') comments_str = '' if comments: for comment in comments: comments_str += comment.get('owner').get('name') + " : " + handle_link(comment.get('text')) comments_str += '<br><br>'

最终评论展示效果:

评论展示效果

优化 中文问题

生成 PDF 后,打开发现中文全部显示为方框,如下图:

中文显示问题

这表示服务器未安装中文字体,安装字体即可,安装下面说明;

查看目前安装字体:fc-list

下载所需字体,例如 fangsong_GB2312.ttf

mkdir /usr/share/fonts/zh_CN

cp fangsong_GB2312.ttf /usr/share/fonts/zh_CN

执行fc-cache -fv

查看是否安装成功:fc-list,查看是已安装

查看字体列表

重新生成后,一切 OK:

显示正常的中文

页面空白优化

生成成功,但是返现每篇文章默认都是新的一页,出现大块空白,阅读时非常别扭,于是我想着是否可以进行优化。

之所以是一篇星球推文显示成单独的一页,是因为原作者处理时,是将推文分别保存成 HTML 文件进行处理,然后再转换成 PDF。

那么我的思路就是,将每篇推文放在单独的 <body> 里,最后合并成一个 HTML,这样最终显示的就是连续的页面了。

修改前:

大段空白

修改后:

连续的页面

超链接优化

在原作者的代码中,没有对超链接进行处理,而星球中有大部分都是进行超链接的分享。

其实这是分享的超链接

没有处理的原因是,抓取到的代码中,超链接是这种形式的:

<e type="web" href="http://www.likecs.com/https%3A%2F%2Fmp.weixin.qq.com%2Fs%2Fw8geobayB8sIRWYcxmvCSQ" title="5000%E5%AD%97%E9%95%BF%E6%96%87%E5%91%8A%E8%AF%89%E4%BD%A0%EF%BC%8CSEO%E6%AF%8F%E6%97%A5%E6%B5%81%E9%87%8F%E5%A6%82%E4%BD%95%E4%BB%8E0%E5%88%B010000%2B" cache="http%3A%2F%2Fcache.zsxq.com%2F201808%2F732760494981a6500d8aadf0469efbf205c21d23ca472826f13e127799973455"/>

发现是用 <e> 标签包围的,这不是 HTML 原生标签,所以导致无法解析,进而页面也无法展示,我们要做的就是从中解析出超链接内容,并拼接成 HTML 中的超链接。

另外,发现超链接的 URL 是转码后的内容,我们也需要对其进行处理。

这部分的处理代码如下:

# 对文本进行 URL 解码,要不后面解析处理也无法点击 def handle_link(text): # 星球中用 <e> 表示超链接 # 这里我们进行转换 soup = BeautifulSoup(text,"html.parser") links = soup.find_all('e', attrs={'type':'web'}) if len(links): for link in links: title = link.attrs['title'] href = link.attrs['href'] s = '<a href=http://www.likecs.com/{}>{} </a>'.format(href,title) text += s # 清理原文中的 <e> 标签 # 这里不清理也没问题,HTML 解析不了,页面也不会显示 # 但是,强迫症。 text = re.sub(r'<e[^>]*>', '', text).strip() return text

处理后:

超链接处理效果

当然,最好的方式是把超链接的内容也爬取出来,一并放在 PDF 里,这里我就不搞了,有兴趣的尝试下吧。

换行处理

换行在星球上显示是这样的:

星球显示

但是到 PDF 后,换行全部没了,大段文字看起来很费劲:

换行失败

这个处理起来就比较简单了,只要将返回数据中的 \n 替换为 HTML 中的换行标签 <br> 即可:

例如获取精华正文时:

text = handle_link(unquote(content.get('text', '').replace("\n", "<br>")))

需要注意的是,需要在解码之前进行替换。

效果:

换行处理效果

至此,基本需求已完成。

完整代码关注公众号后回复【星球】即可获取。

如果觉得有用,欢迎关注我的微信,一起学习,共同进步,不定期推出赠书活动~

你的关注是对我最大的鼓励!

最近搜集到传智播客 2018 最新 Python 和 Java 教程!关注本公众号,后台回复「2018」即可获取下载地址。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwyjj.html