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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
python追加元素到列表的方法
Jul 28 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
python使用thrift教程的方法示例
Mar 21 Python
Python安装Flask环境及简单应用示例
May 03 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
Python list与NumPy array 区分详解
Nov 06 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
详解php中 === 的使用
2016/10/24 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
目前最全的python的就业方向
2018/06/05 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
Java基础类库面试题
2013/09/04 面试题
篮球比赛策划方案
2014/06/05 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript