之前在学习linux时尝试着将电脑系统装为双系统。而在Linux环境下像微软软件的替代品也有不少(当然特指ubuntu)而在学校机房就没有这么幸运了,Kali Linux就是一个典型的例子,但是文档的通行格式却不是docx或者doc,而是PDF( Portable Document Format,便携式文档格式 ),PDF可以让用户在不同的系统上用同样的方式查看文本文档和图片。
PDF
目前在python2.x里有不少的PDF解析库,还没有迁移到python3.x版本,但是由于PDF本身不复杂,而且又是开源的文档格式,所以有一些给力的Python库可以读取PDF文件,而且支持Python3.x版本:即PDFMiner3K,他十分灵活可以通过命令行使用,也可以整合到代码当中,也可以处理不同语言的编码,而且对于网络文件的处理也是十分给力。(继上次没又找到在线的txt资源后又没有找到pdf。。毕竟html相较于pdf太好用了。)
安装--下载地址:https://pypi.python.org/pypi/pdfminer3k(我就继续用pychrom偷懒了/这里我用的是2k+py2.7。)
from urllib import urlopen from pdfminer.pdfinterp import PDFResourceManager, process_pdf from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from io import StringIO from io import open def readPDF(pdfFile): rsrcmgr = PDFResourceManager() retstr = StringIO() laparams = LAParams() device = TextConverter(rsrcmgr, retstr, laparams=laparams) process_pdf(rsrcmgr, device, pdfFile) device.close() content = retstr.getvalue() retstr.close() return content pdfFile = urlopen("http://localhost:8080/test.pdf") outputString = readPDF(pdfFile) print(outputString) pdfFile.close()
输出有点尴尬//因为有好几张小图。。然后就不太乐观就不放了
微软Word和.docx
作为假粉丝和破解版用户,word系列可以说是用的最舒心的文档处理软件,无广告功能强大,表格文件图片随便衔接,各种统计和格式化功能让你用的很舒心(不像某wps,天天一堆广告还卡的要死)在某些网站上很流行word文档,其实在我心目而言,若是资源上纲上线,html无疑是最好的。在08(具体不知道了)以前,微软使用.doc格式,这种二进制格式很难读取,为了兼容和跟上时代,微软推出了类xml格式标准的.docx。虽然在Python当中有一个python-docx库(http://python-docx.readthedocs.org/en/ latest/)但是坦言论:一个只能读取文档大小和文件标题的库对于实际没有什么用处,若要读取正文内容,问题就又回归到了XML解析。其实稍微注意一下就会发先一个问题:word文档完全可以另存为xml,事实正式如此:
from zipfile import ZipFile from urllib.request import urlopen from io import BytesIO wordFile = urlopen("http://localhost:8080/kka.docx").read() wordFile = BytesIO(wordFile) document = ZipFile(wordFile) xml_content = document.read('word/document.xml') print(xml_content.decode('utf-8'))
这样我们暂且得到了xml。所以接下来要做的事情就是解析XML:
wordObj = BeautifulSoup(xml_content.decode('utf-8')) textStrings = wordObj.findAll() for textElem in textStrings: print(textElem.text)
虽然上面的写法写出来可能会有点格式不对,但是依旧可以输出当中的所有文字,如果要详细解析那就得进一步观察:标签存在<w:val>或者<w:p>等,所以可以利用BeautifulSoup的导航功能来解决:
textStrings = wordObj.findAll("w:t") for textElem in textStrings: closeTag = "" try: style = textElem.parent.previousSibling.find("w:pstyle") if style is not None and style["w:val"] == "Title": print("<h1>") closeTag = "</h1>" except AttributeError: pass print(textElem.text) print(closeTag)
当然这部分功能仅限于docx了。。其他的有些好像不可以。但是这个解析xml稳的(其实要真解析还需更详细)