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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
Python自动重试HTTP连接装饰器
Apr 28 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
python十进制转二进制的详解
Feb 07 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 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下使用iconv需要注意的问题
2010/11/20 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
php探针不显示内存解决方法
2019/09/17 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
AngularJS页面传参的5种方式
2017/04/01 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Python中zfill()方法的使用教程
2015/05/20 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python最小二乘法矩阵
2019/01/02 Python
python字典的遍历3种方法详解
2019/08/10 Python
python二维键值数组生成转json的例子
2019/12/06 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python爬取网页信息的示例
2020/09/24 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
烹饪自我鉴定
2014/03/01 职场文书
幼儿园评语大全
2014/04/17 职场文书
男女朋友协议书
2014/04/23 职场文书
导游词书写之黄山
2019/08/06 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS