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基于pillow判断图片完整性的方法
Sep 18 Python
Python如何快速实现分布式任务
Jul 06 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
手把手教你python实现SVM算法
Dec 27 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
解决python线程卡死的问题
Feb 18 Python
python 实现字符串下标的输出功能
Feb 13 Python
python识别验证码图片实例详解
Feb 17 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
Python中关于logging模块的学习笔记
Jun 03 Python
Python3+selenium配置常见报错解决方案
Aug 28 Python
Python中免验证跳转到内容页的实例代码
Oct 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原理的opcodes(操作码)
2010/10/26 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
jquery实现数字输入框
2017/02/22 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
Vue2路由动画效果的实现代码
2017/07/10 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python实现把回车符\r\n转换成\n
2015/04/23 Python
pandas object格式转float64格式的方法
2018/04/10 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
Python如何实现强制数据类型转换
2019/11/22 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
python爬虫容易学吗
2020/06/02 Python
python新手学习可变和不可变对象
2020/06/11 Python
详解python内置模块urllib
2020/09/09 Python
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
音乐系毕业生自荐信
2013/10/27 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
个人优缺点自我评价
2014/01/27 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
学术会议通知
2015/04/15 职场文书
公司催款律师函
2015/05/27 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android