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 调用DLL操作抄表机
Jan 12 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
Python下的subprocess模块的入门指引
Apr 16 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
PyQt5实现拖放功能
Apr 25 Python
python3实现windows下同名进程监控
Jun 21 Python
神经网络相关之基础概念的讲解
Dec 29 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
numpy:找到指定元素的索引示例
Nov 26 Python
python实现银行账户系统
Feb 22 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
ip签名探针
2006/10/09 PHP
php 获取客户端的真实ip
2009/11/30 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Python实现文件复制删除
2016/04/19 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
python和opencv实现抠图
2018/07/18 Python
python flask安装和命令详解
2019/04/02 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
linux下进程间通信的方式
2014/12/23 面试题
后勤岗位职责
2013/11/26 职场文书
政风行风评议整改方案
2014/09/15 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
小学运动会宣传稿
2015/07/23 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
python画条形图的具体代码
2022/04/20 Python