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的web框架中配置app的教程
Apr 30 Python
python爬虫使用cookie登录详解
Dec 27 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Python tkinter和exe打包的方法
Feb 05 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
Pytest mark使用实例及原理解析
Feb 22 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
Python合并多张图片成PDF
Jun 09 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
模仿OSO的论坛(五)
2006/10/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
原生javascript移动端滑动banner效果
2017/03/10 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
Python中if有多个条件处理方法
2020/02/26 Python
jupyter notebook实现显示行号
2020/04/13 Python
Python如何实现定时器功能
2020/05/28 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
初二政治教学反思
2014/01/12 职场文书
给面试官的感谢信
2014/02/01 职场文书
学校四群教育实施方案
2014/06/12 职场文书
物理学专业求职信
2014/07/04 职场文书
跑吧孩子观后感
2015/06/10 职场文书
2016年万圣节活动总结
2016/04/05 职场文书