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简单进程锁代码实例
Apr 27 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
浅谈Python处理PDF的方法
Nov 10 Python
使用Python读取大文件的方法
Feb 11 Python
python递归实现快速排序
Aug 18 Python
python 实现识别图片上的数字
Jul 30 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Python Django搭建文件下载服务器的实现
May 10 Python
Python数据分析之绘图和可视化详解
Jun 02 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 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程序
2006/10/09 PHP
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
php curl模拟post请求小实例
2013/11/13 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
javascript parseInt 大改造
2009/09/27 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
django框架auth模块用法实例详解
2019/12/10 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
实习自我鉴定范文
2013/10/30 职场文书
影视制作岗位职责
2013/12/04 职场文书
财务情况说明书范文
2014/05/06 职场文书
环境建议书
2015/02/04 职场文书
小学英语教学反思范文
2016/02/15 职场文书
创业计划书之儿童理发店
2019/09/27 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
python实现简单的三子棋游戏
2022/04/28 Python