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实现一次创建多级目录的方法
May 15 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
python函数形参用法实例分析
Aug 04 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
python定向爬取淘宝商品价格
Feb 27 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python中如何导入类示例详解
Apr 17 Python
python打开windows应用程序的实例
Jun 28 Python
django框架模板语言使用方法详解
Jul 18 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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 删除记录实现代码
2009/03/12 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
js有序数组的连接问题
2013/10/01 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
几种响应式文字详解
2017/05/19 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python pillow模块使用方法详解
2019/08/30 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Python异常处理机制结构实例解析
2020/07/23 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
服装公司总经理岗位职责
2013/11/30 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
2014年司法局工作总结
2014/12/11 职场文书
2015年外联部工作总结
2015/04/03 职场文书
仓库管理制度范本
2015/08/04 职场文书
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技