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 相关文章推荐
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
简述Python中的进程、线程、协程
Mar 18 Python
Python 修改列表中的元素方法
Jun 26 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python之文件读取一行一行的方法
Jul 12 Python
python3 爬取图片的实例代码
Nov 06 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python中id函数运行方式
Jul 03 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 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
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
python set内置函数的具体使用
2019/07/02 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
运动会标语
2014/06/21 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
2015年女职工工作总结
2015/05/15 职场文书
初三英语教学反思
2016/02/15 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers