python爬取网页内容转换为PDF文件


Posted in Python onJuly 28, 2020

本文实例为大家分享了python爬取网页内容转换为PDF的具体代码,供大家参考,具体内容如下

将廖雪峰的学习教程转换成PDF文件,代码只适合该网站,如果需要其他网站的教程,可靠需要进行稍微的修改。

# coding=utf-8 
import os 
import re 
import time 
import pdfkit 
import requests 
from bs4 import BeautifulSoup 
from PyPDF2 import PdfFileMerger
import sys
reload(sys)
sys.setdefaultencoding('utf8')

html_template = """ 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
 <meta charset="UTF-8"> 
</head> 
<body> 
{content} 
</body> 
</html> 

""" 

#----------------------------------------------------------------------
def parse_url_to_html(url, name): 
 """ 
 解析URL,返回HTML内容 
 :param url:解析的url 
 :param name: 保存的html文件名 
 :return: html 
 """ 
 try: 
  response = requests.get(url) 
  soup = BeautifulSoup(response.content, 'html.parser') 
  # 正文 
  body = soup.find_all(class_="x-wiki-content")[0] 
  # 标题 
  title = soup.find('h4').get_text() 

  # 标题加入到正文的最前面,居中显示 
  center_tag = soup.new_tag("center") 
  title_tag = soup.new_tag('h1') 
  title_tag.string = title 
  center_tag.insert(1, title_tag) 
  body.insert(1, center_tag) 
  html = str(body) 
  # body中的img标签的src相对路径的改成绝对路径 
  pattern = "(<img .*?src=\")(.*?)(\")" 

  def func(m): 
   if not m.group(3).startswith("http"): 
    rtn = m.group(1) + "http://www.liaoxuefeng.com" + m.group(2) + m.group(3) 
    return rtn 
   else: 
    return m.group(1)+m.group(2)+m.group(3) 
  html = re.compile(pattern).sub(func, html) 
  html = html_template.format(content=html) 
  html = html.encode("utf-8") 
  with open(name, 'wb') as f: 
   f.write(html) 
  return name 

 except Exception as e:
  print "解析错误!"

#----------------------------------------------------------------------
def get_url_list(): 
 """ 
 获取所有URL目录列表 
 :return: 
 """ 
 response = requests.get("http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000") 
 soup = BeautifulSoup(response.content, "html.parser") 
 menu_tag = soup.find_all(class_="uk-nav uk-nav-side")[1] 
 urls = [] 
 for li in menu_tag.find_all("li"): 
  url = "http://www.liaoxuefeng.com" + li.a.get('href') 
  urls.append(url) 
 return urls 

#----------------------------------------------------------------------
def save_pdf(htmls, file_name): 
 """ 
 把所有html文件保存到pdf文件 
 :param htmls: html文件列表 
 :param file_name: pdf文件名 
 :return: 
 """ 
 options = { 
  'page-size': 'Letter', 
  'margin-top': '0.75in', 
  'margin-right': '0.75in', 
  'margin-bottom': '0.75in', 
  'margin-left': '0.75in', 
  'encoding': "UTF-8", 
  'custom-header': [ 
   ('Accept-Encoding', 'gzip') 
  ], 
  'cookie': [ 
   ('cookie-name1', 'cookie-value1'), 
   ('cookie-name2', 'cookie-value2'), 
  ], 
  'outline-depth': 10, 
 } 
 pdfkit.from_file(htmls, file_name, options=options) 

#----------------------------------------------------------------------
def main(): 
 start = time.time() 
 file_name = u"liaoxuefeng_Python3_tutorial" 
 urls = get_url_list() 
 for index, url in enumerate(urls):
  parse_url_to_html(url, str(index) + ".html") 
 htmls =[] 
 pdfs =[] 
 for i in range(0,124): 
  htmls.append(str(i)+'.html') 
  pdfs.append(file_name+str(i)+'.pdf') 

  save_pdf(str(i)+'.html', file_name+str(i)+'.pdf') 

  print u"转换完成第"+str(i)+'个html' 

 merger = PdfFileMerger() 
 for pdf in pdfs:
  merger.append(open(pdf,'rb'))
  print u"合并完成第"+str(i)+'个pdf'+pdf 

 output = open(u"廖雪峰Python_all.pdf", "wb") 
 merger.write(output) 

 print u"输出PDF成功!" 

 for html in htmls: 
  os.remove(html) 
  print u"删除临时文件"+html 

 for pdf in pdfs: 
  os.remove(pdf) 
  print u"删除临时文件"+pdf 

 total_time = time.time() - start 
 print(u"总共耗时:%f 秒" % total_time)

#----------------------------------------------------------------------
def changeDir(dir_name):
 """
 目录切换
 """
 if not os.path.exists(dir_name):
  os.mkdir(dir_name)

 os.chdir(dir_name)
#----------------------------------------------------------------------
if __name__ == '__main__':
 #存放文件的路径
 dir_name = '/home/Python/Html' 
 changeDir(dir_name)
 main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单的抓取淘宝图片的Python爬虫
Dec 25 Python
解决Python传递中文参数的问题
Aug 04 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python用threading实现多线程详解
Feb 03 Python
基于Python闭包及其作用域详解
Aug 28 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python利用tkinter实现屏保
Jul 30 Python
opencv python图像梯度实例详解
Feb 04 Python
python交互模式基础知识点学习
Jun 18 Python
python GUI模拟实现计算器
Jun 22 Python
python时间time模块处理大全
Oct 25 Python
python爬取网页转换为PDF文件
Jun 07 #Python
python实现pdf转换成word/txt纯文本文件
Jun 07 #Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 #Python
python生成ppt的方法
Jun 07 #Python
python实现按长宽比缩放图片
Jun 07 #Python
python实现批量修改图片格式和尺寸
Jun 07 #Python
python实现批量图片格式转换
Jun 16 #Python
You might like
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
Python创建xml文件示例
2017/03/22 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
机器学习python实战之手写数字识别
2017/11/01 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
详解python中的线程与线程池
2019/05/10 Python
django云端留言板实例详解
2019/07/22 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
python scipy卷积运算的实现方法
2019/09/16 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
大学生个人事迹材料
2014/01/21 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python