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下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
启动Atom并运行python文件的步骤
Nov 09 Python
python实现任意位置文件分割的实例
Dec 14 Python
python实现抖音点赞功能
Apr 07 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
Django+boostrap 美化admin后台的操作
Mar 11 Python
Python图片处理模块PIL操作方法(pillow)
Apr 07 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 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
php 常用字符串函数总结
2008/03/15 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python切片操作实例分析
2018/03/16 Python
对于Python深浅拷贝的理解
2019/07/29 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
酒店秘书求职信范文
2014/02/17 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
2014年党小组工作总结
2014/12/20 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
React如何创建组件
2021/06/27 Javascript
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis