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利用elaphe制作二维条形码实现代码
May 25 Python
python复制文件的方法实例详解
May 22 Python
Python手机号码归属地查询代码
May 04 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
多个python文件调用logging模块报错误
Feb 12 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
python tkinter实现连连看游戏
Nov 16 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 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
PHP自定义错误用法示例
2016/09/28 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
YII框架http缓存操作示例
2019/04/29 PHP
php fread函数使用方法总结
2019/05/28 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
少年闰土教学反思
2014/02/22 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python