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中第三方库Requests库的高级用法详解
Mar 12 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
使用Python读取大文件的方法
Feb 11 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 Python
flask session组件的使用示例
Dec 25 Python
解决python Markdown模块乱码的问题
Feb 14 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
Sep 20 Python
Python中re模块的元字符使用小结
Apr 07 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数据饼图效果实现代码
2011/11/23 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
javascript打印输出json实例
2013/11/11 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python+Opencv识别两张相似图片
2020/03/23 Python
python用户管理系统
2018/03/13 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
机关门卫岗位职责
2013/12/30 职场文书
电台实习生求职信
2014/02/25 职场文书
在校实习生求职信
2014/06/18 职场文书
五一口号
2014/06/19 职场文书
公证委托书
2014/08/01 职场文书
酒会邀请函
2015/01/31 职场文书
业务员辞职信范文
2015/03/02 职场文书
防溺水主题班会教案
2015/08/12 职场文书
初中语文教师研修日志
2015/11/13 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js