IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 知乎回答一键导出为PDF——Python实现 -> 正文阅读

[Python知识库]知乎回答一键导出为PDF——Python实现

作者:token comment


为什么做知乎回答的导出?


“恰同学少年,风华正茂;

书生意气,挥斥方遒。

指点江山,激扬文字…”


知乎上总有许多令人眼前一亮、深入浅出的人类高质量回答,它们往往从读者少有或从未注意过的角度深入问题,从而引出新的观点。

遇到这种随时可能被折叠or删除的回答,收集癖怎么可能坐得住?!

于是花一晚上堆出了一段优雅而不失暴力的代码,用于实现知乎回答一键导出为PDF。


实现环境


CPU :Intel? Core? i7-9750H CPU @ 2.60GHz

wkhtmltopdf安装位置 :N:\wkhtmltox\bin\wkhtmltopdf.exe

Windows :Win10 家庭版

PyCharm :2020.1.1 (Community Edition) Build #PC-201.7223.92, built on April 30, 2020

测试回答链接 :https://www.zhihu.com/question/463243373/answer/1983723459


源代码


由于急着用所以写的比较简陋,其中很多地方写的都十分暴力(例如“知乎图床重处理”部分就可以用BeautifulSoap库去实现等等),针对形如“https://www.zhihu.com/question/问题编号/answer/回答编号”可实现就行啦。

后续有空可能会加入多网址多线程解析导出PDF单问题所有高赞回答导出PDF收藏夹下所有回答导出PDF适用其他图文发布网站的解析导出等。

现存问题:图文排版可能出现问题、未做登录cookie、基本没啥robustness

来看代码实现吧:

# -*- coding: utf-8 -*-
"""
ZhihuCapture.py
@author: Felerdise
"""
# 无需多言的导入,其中time仅用于导出计时
import requests
import re
import pdfkit
import time
def GetZhiHuAnswer(url):
    # 浏览器标识设置为Chrome,有效去除冗余组件
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"
    }
    r = requests.get(url, headers=header)
    r.encoding = 'utf-8'
    html = r.text

    # 去冗余:对html数据暴力处理
    # Answer中的大量冗余脚本<script>
    if ZhiHuAnswer:
        html = html[0: html.find(r'<script id="js-initialData"')]
    # 登录
    html = html.replace(r'"Question-mainColumnLogin"', r'"Question-mainColumnLogin" style="display:none"',
                        html.count(r'"Question-mainColumnLogin"'))
    html = html.replace(r'"AppHeader-userInfo"', r'"AppHeader-userInfo" style="display:none"',
                        html.count(r'"AppHeader-userInfo"'))
    # 查看所有回答
    html = html.replace(r'"Card ViewAll"', r'"Card ViewAll" style="display:none"', html.count(r'"Card ViewAll"'))
    # 知乎app定向
    html = html.replace(r'"ModalWrap"', r'"ModalWrap" style="display:none"', html.count(r'"ModalWrap"'))
    # 图片懒加载
   
    # 知乎图床重处理(此处储存的是品质略差的图片)
    html = re.sub(r'<noscript>.*?</noscript>', '', html)
    ImgObj = re.findall(r'<img .*?/>', html)
    for item in ImgObj:
        if r'data-actualsrc' in item:
            srcObj = re.findall(r'src="(.*?)"', item)[0]
            actualObj = re.findall(r'data-actualsrc="(.*?)"', item)[0]
            html = html.replace(srcObj, actualObj, 1)
    
    # 专栏收录文章
    if ZhiHuZhuanLan:
        html = html.replace(r'Post-Sub Post-NormalSub"', r'Post-Sub Post-NormalSub" style="display:none"', html.count(r'Post-Sub Post-NormalSub"'))

    # 提取标题
    searchObj = re.search(r'<title data-react-helmet="true">(.*?)</title>', html)
    titleOverall = searchObj.group(1)

    # 以源码输出PDF
    # 设置wkhtmltopdf.exe路径(此处为绝对路径,请根据相应安装位置调整)
    try:
        config = pdfkit.configuration(wkhtmltopdf=r'N:\wkhtmltox\bin\wkhtmltopdf.exe')
    except:
        print("Error: ExeDirectionError")
        return
    
        # 设置输出格式
    option = {
        'quiet': '',
        'page-size': 'Letter',
        'dpi': '300',
        'disable-smart-shrinking': '',
        'margin-top': '0in',
        'margin-right': '0in',
        'margin-bottom': '0in',
        'margin-left': '0in',
        'encoding': "UTF-8",
        # 'custom-header': [
        # ],
        # 'cookie': [
        # ],
        'no-outline': None,
        # 'javascript-delay': '',
    }

    # html输出PDF
    try:
        pdfkit.from_string(html, "{}.pdf".format(titleOverall), configuration=config, options=option)
    except:
        print("Error: PDFGenerateError")
        return
ZhiHuAnswer = False
ZhiHuZhuanLan = False

if __name__ == '__main__':
    keyword = input('输入待解析的知乎答案网址:\n').strip('\r\n')
    # keyword = 'https://www.zhihu.com/question/463243373/answer/1983723459'
    # 多网址数据,多线程
    # if '\n' in keyword:
    #     keyword = keyword.split('\n')
    #     pass
    TimeStart = time.time()
    # 这里本是想做拓展的
    if 'zhihu' in keyword:
    	if 'answer' in keyword:
        	ZhiHuAnswer = True
        # GetZhiHuAnswer(keyword)
    	elif 'zhuanlan' in keyword:
        	ZhiHuZhuanLan = True
        # GetZhiHuAnswer(keyword)
   		ZhiHuCaptor(keyword)
    else:
        pass
    TimeLapse = time.time() - TimeStart
    print('Time used: {:.2f}s'.format(TimeLapse))

PDF导出测试结果


截取了头尾与中部三个部分的导出PDF截图以示意。





到此为止啦,日常瞎写的小工具(づ。????。)づ

测试回答链接生成的PDF中,字数为5000+字、图片数量为10+张、PDF导出用时为8.50s

用于展示PDF导出结果的截图等若涉侵权,请第一时间告知我,我将修改文中的侵权内容

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:33:29  更:2021-08-12 16:34:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 16:48:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码