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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
python二叉树的实现实例
Nov 21 Python
python检测lvs real server状态
Jan 22 Python
python读写ini配置文件方法实例分析
Jun 30 Python
python基础教程之分支、循环简单用法
Jun 16 Python
判断网页编码的方法python版
Aug 12 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
python读取Kafka实例
Dec 23 Python
Numpy 多维数据数组的实现
Jun 18 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实现链结人气统计
2006/10/09 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
Vue DevTools调试工具的使用
2017/12/05 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
详解Nuxt.js 实战集锦
2019/11/19 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
Python控制台实现交互式环境执行
2020/06/09 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
护理中职生求职信范文
2014/02/24 职场文书
村庄绿化方案
2014/05/07 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
反邪教学习心得体会
2016/01/15 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL