大约在2008年以前,微软Office产品中的Word用.doc文件格式。这种二进制格式很难读取,而且能够读取word格式软件很少。为了跟上时代,让自己的软件能够符合主流软件的标准,微软决定使用Open Office的类XML格式标准,此后新版Word文件才与其他文字处理软件兼容,这个格式就是.docx。
不过Python对这种Google Docs,Open Office和Microsoft Office都在使用的.docx格式支持还不够好。虽然有一个python-docx库,但是只支持创建新文档和读取一些基本的文件数据,如文件大小和文件标题,不支持正文读取。如果想要从Microsoft Office文件的正文内容,我们需要自己动手找方法:
第一步是从文件读取XML:
-
from zipfile import Zip
File
-
from urllib.request import urlopen
-
from io import BytesIO
-
wordFile=urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read()
-
wordFile=BytesIO(wordFile)
-
document=ZipFile(wordFile)
-
xml_content=document.read('word/document.xml')
-
print(xml_content.decode('UTF-8'))
程序执行结果如下:
通过执行结果发现,确实包含了大量的信息,但是都被隐藏在XML里面,好在文档的所有正文内容都包含在<w:t>标签里面。标题的内容也是如下,这样就比较好处理了。改进后的程序代码如下:
-
from zipfile import ZipFile
-
from urllib.request import urlopen
-
from io import BytesIO
-
from bs4 import BeautifulSoup
-
-
wordFile=urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read()
-
wordFile=BytesIO(wordFile)
-
document=ZipFile(wordFile)
-
xml_content=document.read('word/document.xml')
-
-
wordObj=BeautifulSoup(xml_content.decode('utf-8'),"xml")
-
textString=wordObj.findAll("w:t")
-
for textElem in textString:
-
print(textElem.text)
-
在此处需要注意一个问题,因为此处是先将word文档转换为xml文档,所以在使用BeautifulSoup进行文档内容解析的时候,需要执行解析器的xml,这样findAll才能正常执行。不可以不指定。
执行结果如下:
你会看到这里docx单独一行,这是因为在原始的XML里,它是由<w:proofErr w:type="spellStart"/>标签包围的。这是Word用红色波浪线高亮显示"docx"的方式,提示这个词可能拼写错误。
来源:oschina
链接:https://my.oschina.net/u/4612090/blog/4505397