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中xrange和range的区别
May 13 Python
Python中with及contextlib的用法详解
Jun 08 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
python调用java的jar包方法
Dec 15 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 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
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
为什么是 Python -m
2020/06/19 Python
HTML5注册页面示例代码
2014/03/27 HTML / CSS
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
住房公积金接收函
2014/01/09 职场文书
学生感冒英文请假条
2014/02/04 职场文书
新任教师自我鉴定
2014/02/24 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
对教师的评语
2014/04/28 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
施工工地安全标语
2014/06/07 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
英文升职感谢信
2015/01/23 职场文书
城管个人总结
2015/02/28 职场文书
财务统计员岗位职责
2015/04/14 职场文书
2015年度保密工作总结
2015/04/24 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
小学校长开学致辞
2015/07/29 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS