当前位置 : IT培训网 > IT培训 > 交流分享 > 妙用Python将word文件转换成html 方法超简单

妙用Python将word文件转换成html 方法超简单

时间:2018-01-09 15:59:11  来源:python培训网  作者:IT培训网  已有:名学员访问该课程
标签(Tag):   Python将word文(1)
什么方法可以将word文件转换成html,找了一圈,没有发现合适的应用可以把word或indd转化成干净的html。机缘巧合,无意间听说python很擅长文本处理,用Python将word文件转换成html,作了这样的尝试,这是我第一次用python写项目,还真的

什么方法可以将word文件转换成html,找了一圈,没有发现合适的应用可以把word或indd转化成干净的html。机缘巧合,无意间听说python很擅长文本处理,用Python将word文件转换成html,作了这样的尝试,这是我第一次用python写项目,还真的能实现,而且非常方便。

妙用Python将word文件转换成html 方法超简单_www.itpxw.cn

Pythonword文件转换成html流程是什么?

用逆天的python模块mammoth和docx 处理你的word文件;把indd批量转化成pdf然后用layout_scanner转化成html。

word批量转化为html方法如下:

1 建立文件结构并批量读取文件

在根目录下创建几个文件夹,用来放不同格式的文件,我把所有要处理的word文件放在docfiles 这个子目录里。word.py里写转化程序。

├──docfiles

├──imgs

├──inddfiles

├──output

└──pdfs

└──word.py

2、引入模块和申明文件路径

importmammoth

importmammoth.transforms

importos

fromdocximportDocument

frombsonimportjson_util

importzipfile

importjson

importunidecode

importrequests

guidUrl="https://my.phrplus.com/REST/guid"

inputPath='/Users/admin/cwell/parser/docfiles/'

imgPath="/Users/admin/cwell/parser/imgs/"

outputFile='/Users/admin/cwell/parser/output/output.json'

mammoth: 核心组件,用来做转化工作

docx: 另一个做转化工作的模块,用来补充mammoth

os: 用来在系统中读取写入文件

zipfile: 用来解压word文档以提取图片

json: 用来把数据转化成json

bson: 用来配置写入json文件

unicode:用来处理字符

requests:用来调用api

3、转换单个文件

styleMap="""

p[style-name='Title'] => h1.hide

p[style-name='Subhead 1'] => h3

p[style-name='List Bullet'] => ul.first > li:fresh

p[style-name='List Bullet 2'] => ul.second > li:fresh

p[style-name='Hyperlink']=>a.link

"""

defconvert_image(image):

   return{

      "src":""

   }

defparseFile(f):

   document=Document(inputPath+f)

   article={"Title":document.core_properties.title,"Content":""}

   withopen(inputPath+f,"rb")asdocFile:

       html=mammoth.convert_to_html(docFile,style_map=styleMap,convert_image=mammoth.images.img_element(convert_image))

       decoded=unidecode.unidecode(html.value)

   ifnotarticle["Title"]:

      forparaindocument.paragraphs:

           ifpara.style.name=='Title':

               ifpara.text:

                   article["Title"]=para.text

   article["Content"]=decoded

   returnarticle  

parseFile就是核心功能了。传递进来的参数f是文件名,和文件路径合在一起能够帮我们准确定位要转化的文件。首先用docx找到文档的标题,并创建一个dictionary,里面包含标题和内容。然后用mammoth转化整个文件。注意命令中要用到stylemap和convertimage。前者用来规定转化规则:'style-name'是word里的式样名称,用word打开文档,点击任意一个元素可以查看其式样名称;这里规定标题转化为h1,副标题转化为h2等等。关于列表的转化规则这里就不详细叙述了,具体可以参考下面的文章:

参考链接

Convertingdocx to clean HTML:handling the XML structure mismatch

'convert_image' 是用来规定图片的转化方式的,由于我准备之后批处理所有文档中的图片,在这里就告诉程序不储存任何图片信息。但是于此同时保留图片的img tag以便标注图片在文档中的位置。如果不规定任何转化方式,生成的html里面会包含一大长串base64的图片信息。

mammoth转化出来的html是含有unicode的,不知道为什么python里跑一直报错,就用unicode解码了一下。

这之后,如果前面的程序没有抓取到文档标题,用docx换个姿势再抓取一下。

最后返回article这个dictionary。

4、抓取图片

defextractImage(f):

   ziped=zipfile.ZipFile(inputPath+f)

   allFiles=ziped.namelist()

   imgs=filter(lambdax:x.startswith('word/media/'),allFiles)

   imgNameArr=[]

   forimginimgs:

      res=requests.post(guidUrl)

       ifres.status_codeis200:

           guid=res.text

           data=ziped.read(img,imgPath)

           idxStr=os.path.basename(img).split(".")[0][-1:]

           imgDict={}

           imgDict["index"]=int(idxStr)-1

          imgDict["fileName"]=guid+".jpg"

           imgNameArr.append(imgDict)

           targetPath=os.path.join(imgPath,guid+".jpg")

           target=open(targetPath,"wb")

          target.write(data)

           target.close()

   ziped.close()

   returnimgNameArr

没想到word文档其实是一个压缩文件吧?如果直接把word文档的后缀名改成zip然后再用解压软件查看,会看到一个media文件夹,里面就包含所有插入的图片。

用ziped读取文档,然后找到存放图片的media文件夹,每一个图片重新用guid命名,生成一个dictionary,里面包含的信息有“此图片在文档中出现的顺序”和文件名。话说media中的图片都被按照顺序重新命名为image1.png, image2.png,刚好为我们抓取顺序信息提供了方便。

(python也有生成guid的模块,我在这里调用api有点多此一举,但是为了和项目中其他图片需要用到的uuidv4保持一致还是用了)

之后就是把图片存在‘imgs’这个文件夹下。

5、生成json

defprocessDocs(path):

   result=[]

   forfinos.listdir(path):

       ifnotf.startswith('.'):

           imgNameArr=extractImage(f)

           article=parseFile(f)

          fileName=os.path.basename(f)

           contentArr=article["Content"].split("<img")

           foridx,sectioninenumerate(contentArr):

               forinfoinimgNameArr:

                   ifidxisinfo["index"]:

                       contentArr[idx]=section+"<img alt=&apos;"+info["fileName"]+"&apos; data-fileName=&apos;"+info["fileName"]+"&apos;"

           article["Content"]=&apos;&apos;.join(contentArr)

           result.append(article)

   withopen(outputFile,&apos;w+&apos;)asf:

       json.dump(result,f,default=json_util.default)

最后要用到的一个function就是写个循环挨个处理docfiles文件夹底下的文件了。针对每一个文件,记得把之前生成的图片信息的数组map到html里,然后在写入到json文件里就大功告成了!

indd转化为html

话说,到现在为止,我还没有找到一个完美的解决方案。我使用了相同的思路,把indd先批量生成为pdf(有一个indesign 脚本就是专门批量转化pdf的),然后用了一个叫做layout_scanner的github项目抓取pdf信息并转化为html。最后生成的html包含了文字和图片,但是图标和排版就保存不下来了。客户大大表示不满意。我也很惆怅啊!机智的小伙伴们如果有更好的思路请务必告诉我!如果需要我详细说明一下这一块内容,我会更新在这篇文章中。

参考链接

dpapathanasiou/pdfminer-layout-scanner

综上所述,用Python将word文件转换成html,步骤是不是很简单,内容是不是很流畅,这是个很好的案例,希望对大家有所帮助。

顶一下
(0)
0%
踩一下
(1)
100%

IT培训0元试听 每期开班座位有限.0元试听抢座开始! IT培训0元试听

  • 姓名 : *
  • 电话 : *
  • QQ : *
  • 留言 :
  • 验证码 : 看不清?点击更换请输入正确的验证码

在线咨询在线咨询

温馨提示 : 请保持手机畅通,咨询老师为您
提供专属一对一报名服务。

------分隔线----------------------------
------分隔线----------------------------

推荐内容

相关热点