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脚本使得web页面上的代码高亮显示
Apr 24 Python
Python实现模拟时钟代码推荐
Nov 08 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
关于python爬虫应用urllib库作用分析
Sep 04 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 学习资料零碎东西
2010/12/04 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
Python对文件操作知识汇总
2016/05/15 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
浅谈django orm 优化
2018/08/18 Python
python SocketServer源码深入解读
2019/09/17 Python
Python实现ATM系统
2020/02/17 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
Java如何获得ResultSet的总行数
2016/09/03 面试题
电气工程自动化求职信
2014/03/14 职场文书
市场营销毕业求职信
2014/08/07 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
丧事答谢词大全
2015/09/30 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis