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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
Python查看多台服务器进程的脚本分享
Jun 11 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
Python实现批量下载文件
May 17 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
Django objects的查询结果转化为json的三种方式的方法
Nov 07 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
python中字典增加和删除使用方法
Sep 30 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
curl和libcurl的区别简介
2015/07/01 PHP
php自定义分页类完整实例
2015/12/25 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python enumerate函数的使用方法总结
2017/11/15 Python
Python iter()函数用法实例分析
2018/03/17 Python
使用python画社交网络图实例代码
2019/07/10 Python
Python 线程池用法简单示例
2019/10/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
python为什么会环境变量设置不成功
2020/06/23 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
居安思危观后感
2015/06/11 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
导游词之峨眉山
2019/12/16 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python