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为什么不需要三目运算符和switch
Jun 17 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
python 经典数字滤波实例
Dec 16 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
python使用建议与技巧分享(一)
Aug 17 Python
教你使用pyinstaller打包Python教程
May 27 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生成月历代码
2007/06/14 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
PHP合并静态文件详解
2014/11/14 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
DOM 基本方法
2009/07/18 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
浅析Ajax语法
2016/12/05 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
Python优先队列实现方法示例
2017/09/21 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
python框架django项目部署相关知识详解
2019/11/04 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
Python 存取npy格式数据实例
2020/07/01 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
农药学硕士毕业生自荐信
2013/09/25 职场文书
外语专业毕业生自我评价分享
2013/10/05 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
工作收入证明模板
2015/06/12 职场文书
导游词之广西漓江
2019/11/02 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
Redis高可用集群redis-cluster详解
2022/03/20 Redis