Python实现将HTML转换成doc格式文件的方法示例


Posted in Python onNovember 20, 2017

本文实例讲述了Python实现将HTML转换成doc格式文件的方法。分享给大家供大家参考,具体如下:

网页上的一些文章,因为有格式的原因,它们在网页上的源码都是带有html标签的,用css来进行描述。本文利用HTML Parser 和docx两个模块,对网页进行解析并存储到word文档中。转换出来的格式相对还是有些粗糙,不喜勿喷。话不多说,直接上代码。

class HTMLClient:
  #获取html网页源码
  def GetPage(self, url):
    #user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    user_agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'
    headers = { 'User-Agent' : user_agent }
    req = urllib.request.Request(url, None, headers)
    try:
      res = urllib.request.urlopen(req)
      return res.read().decode("utf-8")
    except urllib.error.HTTPError as e:
      return None
  #获取网络图片并保存在程序运行目录下
  def GetPic(self, url):
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = { 'User-Agent' : user_agent }
    req = urllib.request.Request(url, None, headers)
    try:
      res = urllib.request.urlopen(req)
      return res.read()
    except urllib.error.HTTPError as e:
      return None

html到doc的转换过程中,图片保存和处理是比较麻烦的事情,因为可能涉及到图片格式错误,因此为了保证图片正常运行,应当修改图片添加异常处理流程。

class MYHTMLParser(HTMLParser):
  def __init__(self, docfile):
    HTMLParser.__init__(self)
    self.docfile = docfile
    self.doc = Document(docfile)
    self.myclient = HTMLClient()
    self.text = ''
    self.title = False
    self.isdescription = False
    self.picList=[]
  #根据标签头类型决定标签内容的格式
  def handle_starttag(self, tag, attrs):
    #print "Encountered the beginning of a %s tag" % tag
    self.title = False
    self.isdescription = False
    #<h1>标签说明其中的内容是标题
    if re.match(r'h(\d)', tag):
      self.title = True
    #图片的处理比较复杂,首先需要找到对应的图片的url,然后下载并写入doc中
    #下载的图片格式如果有问题,docx模块会报错,因此重新定义异常处理
    #图片名称需要记录下来,在文档保存后要自动删除
    if tag == "img":
      if len(attrs) == 0: pass
      else:
        for (variable, value) in attrs:
          if variable == "src":
            #此处图片url类型为[http://url/pic.img!200*200]
            #不同网站图片类型不同,因此当作不同处理
            picdata = self.myclient.GetPic(value.split('!')[0])
            if picdata == None:
              pass
            else:
              pictmp = value.split('/')[-1].split('!')[0]
              picfix = value.split('/')[-1].split('!')[-1]
              with open(pictmp, 'wb') as pic:
                pic.write(bytes(picdata))
                pic.close()
              try:
                if picfix[0:1] == 'c':
                  self.doc.add_picture(pictmp, width=Inches(4.5))
                else:
                  self.doc.add_picture(pictmp)#, width=Inches(2.25))
              except docx.image.exceptions.UnexpectedEndOfFileError as e:
                print(e)
              self.picList.append(pictmp)
    #javascript脚本
    if tag == 'script':
      self.isdescription = True
  def handle_data(self, data):
    if self.title == True:
      if self.text != '':
        self.doc.add_paragraph(self.text)
      self.text = ''
      self.doc.add_heading(data, level=2)
    if self.isdescription == False:
      self.text += data
  def handle_endtag(self, tag):
    #if tag == 'br' or tag == 'p' or tag == 'div':
    if self.text != '':
      self.doc.add_paragraph(self.text)
      self.text = ''
  def complete(self, html):
    self.feed(html)
    self.doc.save(self.docfile)
    for item in self.picList:
      if os.path.exists(item):
        os.remove(item)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
PYTHON正则表达式 re模块使用说明
May 19 Python
Python Flask-web表单使用详解
Nov 18 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
python如何实现复制目录到指定目录
Feb 13 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
python中学习K-Means和图片压缩
Nov 20 #Python
深入理解Python中的super()方法
Nov 20 #Python
python实现读取excel写入mysql的小工具详解
Nov 20 #Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 #Python
python Matplotlib画图之调整字体大小的示例
Nov 20 #Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 #Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 #Python
You might like
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
js异或加解密效果代码
2008/06/25 Javascript
Prototype Date对象 学习
2009/07/12 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python实现通讯录功能
2018/02/22 Python
python爬取m3u8连接的视频
2018/02/28 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python笔记之观察者模式
2019/11/20 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
党支部承诺书范文
2014/03/28 职场文书
单位委托书范本
2014/04/04 职场文书
成立公司计划书
2014/05/07 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
MySQL触发器的使用
2021/05/24 MySQL
vue如何清除浏览器历史栈
2022/05/25 Vue.js