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基础教程之面向对象的一些概念
Aug 29 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
python输出pdf文档的实例
Feb 13 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
python中os包的用法
Jun 01 Python
Django模型验证器介绍与源码分析
Sep 08 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
Python实现冒泡排序算法的完整实例
Nov 04 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
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
上班打牌检讨书
2014/02/07 职场文书
安全生产标语
2014/06/06 职场文书
超市客服工作职责
2014/06/11 职场文书
家庭贫困证明
2014/09/23 职场文书
讲座通知范文
2015/04/23 职场文书
党员转正意见怎么写
2015/06/03 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript