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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
Python 含参构造函数实例详解
May 25 Python
对python中的logger模块全面讲解
Apr 28 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
python networkx 根据图的权重画图实现
Jul 10 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
如何对python的字典进行排序
Jun 19 Python
python 递归相关知识总结
Mar 03 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP简洁函数小结
2011/08/12 PHP
基于php split()函数的用法详解
2013/06/05 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python中shape计算矩阵的方法示例
2017/04/21 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
什么是数据抽象
2016/11/26 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
房屋买卖协议书
2014/04/10 职场文书
学生评语大全
2014/04/18 职场文书
党员承诺践诺书
2014/05/20 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
小学生作文评语集锦
2014/12/25 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫