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分治法定义与应用实例详解
Jul 28 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
python学生信息管理系统(完整版)
Apr 05 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
Flask-WTF表单的使用方法
Jul 12 Python
快速查找Python安装路径方法
Feb 06 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
python 数据类型强制转换的总结
Jan 25 Python
python使用glob检索文件的操作
May 20 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
PHP加密解密实例分析
2015/12/25 PHP
php的常量和变量实例详解
2017/06/27 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
深入了解js原型模式
2019/05/30 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python三引号输出方法
2019/02/27 Python
解析Python3中的Import
2019/10/13 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
高校毕业生自我鉴定
2013/10/27 职场文书
学校安全防火方案
2014/06/07 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
读书笔记怎么写
2015/07/01 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android