当前位置: 首页 > 后端技术 > Python

爬虫系列:读取CSV、PDF、Word文档

时间:2023-03-26 01:05:19 Python

上一期我们讲解了使用Python读取文档编码的相关问题。本期我们讲解使用Python处理CSV、PDF、Word文档。CSV在我们收集网页的时候,你可能会遇到CSV文件,或者项目可能需要将数据保存到CSV文件中。Python有一个很棒的标准库,用于读取和写入CSV文件。虽然此库可以处理各种CSV文件,但我们将在此重点介绍标准CSV格式。读取CSV文件Python的CSV主要面向本地用户,这意味着您的CSV文件必须保存在您的计算机上。做网络数据采集的时候,网上有很多文件。不过也有一些方法可以解决这个问题:手动下载CSV文件到本地,然后使用Python定位文件位置;编写Python程序下载文件,读取后删除源文件;直接从网上把文件读成字符串,然后转换成StringIO对象,使其具有文件的属性。虽然也可以使用前两种方法,但是由于CSV文件可以很方便的保存到内存中,所以不要下载到本地占用硬盘空间。直接把文件读成字符串,然后封装成StringIO对象,让Python把它当作一个文件,就不用另存为文件了。下面的程序是从网上获取一个CSV文件,然后将每一行打印到命令行:importrequestsfromioimportStringIOimportcsvclassProcessCSVPDFDOCX(object):def__init__(self):self._csv_path='https://image.pdflibr.com/crawler/blog/country.CSV'self._session=requests.Session()defread_csv(self):response=self._session.get(self._csv_path)#设置文本为utf-8编码响应。encoding='utf-8'response_text=response.textdata_file=StringIO(response_text)dict_reader=csv.DictReader(data_file)打印(dict_reader.fieldnames)forrowindict_reader:print(row)if__name__=='__main__':ProcessCSVPDFDOCX().read_csv()csv.DictReader会将CSV文件的每一行返回成Python字典对象而不是列表对象,并将字段列表保存到变量dict_reader.fieldnames中,字段也作为key字典对象。从某种意义上说,Adobe在1993年发明的PDF格式(ProtableDocumentFormat,便携文档格式)是一场技术革命。PDF允许用户在不同的系统上以相同的方式查看图片和文本文档,而不管文档是在哪个系统上创建的。虽然在网页上显示PDF已经过时(当您已经可以将内容显示为HTML时,为什么要使用这种静态的、加载速度超慢的格式?),但PDF仍然无处不在,尤其是在处理报告和表格的业务时。目前很多PDF解析库都是基于Python2.x版本构建的,并没有迁移到Python3.x版本。不过由于PDF比较简单,而且是开源的文档格式,一些功能强大的Python可以读取PDF文件,支持Python3.x版本。PDFMiner3K是一个非常有用的库(PDFMiner的Python3.x端口)。他非常灵活,可以通过命令行使用,也可以集成到代码中。它还可以处理不同的语言代码,处理网络文件非常方便。您可以下载该模块的源文件(https://pypi.org/project/pdfminer3k/),解压并使用以下命令安装:pythonsetup.pyinstall我们也可以使用pip安装:pipinstallpdfminer3k以下示例可以将任何PDF作为字符串读取并使用StringIO将其转换为文件对象:importrequestsfromioimportStringIOimportcsvfrompdfminer.pdfinterp:f__init__(self):self._session=requests.Session()self._pdf_path='https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'defread_pdf(self,pdf_file):rscmgr=PDFResourceManager()retstr=StringIO()laparames=LAParams()device=TextConverter(rscmgr,retstr,laparams=laparames)process_pdf(rscmgr,device,pdf_file)device.close()content=retstr.getvalue()retstr。close()返回内容defread_pdf_main(自我):pdf_file=urlopen(self._pdf_path)output_string=self.read_pdf(pdf_file)print(output_string)pdf_file.close()if__name__=='__main__':ProcessCSVPDFDOCX().read_pdf_main()readPDF的最大优点是,如果您的PDF如果文件在电脑中,可以直接用普通的open()文件对象替换urlopen返回的对象pdf_file。输入结果可能并不完美,尤其是当文件包含图片、各种文本格式,或包含表格和数据图表时。但是,对于大多数仅包含纯文本内容的PDF,输出与纯文本无法区分。MicrosoftWord和.docx有很多网友抱怨Word。Word的特殊功能就是把那些本该用简单的TXT或PDF格式写的文件变成了又大又慢又难打开的怪物。它们经常在系统之间切换。格式与版本切换不兼容,不知为何文件内容最终确定后应该还是可以编辑的。Word文档从来没有打算经常传递。但是,它们在一些网站上很受欢迎,包括重要的文件、信息,甚至图形和多媒体;简而言之,这些内容应该改用HTML。大约在2008年之前,MicrosoftOffice产品中的Word使用的是.doc文件格式。这种二进制格式很难阅读,很少有软件可以阅读word格式。为了与时俱进,使其软件符合主流软件的标准,微软决定采用OpenOffice的类XML格式标准。之后,新版Word可以兼容其他文字处理软件。此格式为.docx。Docs、OpenOffice和MicrosoftOffice使用的.docx格式不受很好的支持。虽然有python-docx库,但只支持创建和读取一些基本数据,包括文件大小和文件标题,不支持文本读取。如果我们要读取MicrosoftOffice文件的文本内容,就需要自己想办法了。第一步是从文件读取XML:importrequestsfromioimportStringIOimportcsvfrompdfminer.pdfinterpimportPDFResourceManager,process_pdffrompdfminer.layoutimportLAParamsfrompdfminer.converterimportTextConverterfromurllib.requestimporturlopenfromioimportopen,BytesIOfromzipfileimportZipFileclassProcessCSVPDFDOCX(object):def__init__(self):self._csv_path='https://image.pdflibr.com/crawler/blog/country.CSV'self._session=requests.Session()self._pdf_path='https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'self._docx_path='https://image.pdflibr.com/crawler/blog/test_document.docx'defconvert_docx_to_xml(self):word_file=urlopen(self._docx_path).read()word_file=BytesIO(word_file)document=ZipFile(word_file)xml_content=document.read('word/document.xml')打印(xml_content.decode('utf-8'))if__name__=='__main__':ProcessCSVPDFDOCX().convert_docx_to_xml()这段代码将远程Word读入二进制文件对象(BytesIO类似于上面使用的StringIO),然后使用Python的标准库zipfile进行解压(所有.docx文件都压缩以节省空间),然后用于读取解压后的文件,它变成了XML。解压后的XML文件包含很多信息。幸运的是,所有内容都包含在标签中,标题的内容也是如此,这更容易处理。.importrequestsfromioimportStringIOimportcsvfrompdfminer.pdfinterpimportPDFResourceManager,process_pdffrompdfminer.layoutimportLAParamsfrompdfminer.converterimportTextConverterfromurllib.requestimporturlopenfromioimportopen,BytesIOfromzipfileimportZipFilefrombs4importBeautifulSoupclassProcessCSVPDFDOCX(对象):def__init__(自我):self._csv_path='https://image.pdflibr.com/crawler/blog/country.CSV'self._session=requests.Session()self._pdf_path='https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'self._docx_path='https://image.pdflibr.com/crawler/blog/test_document.docx'defconvert_docx_to_xml(self):word_file=urlopen(self._docx_path).read()word_file=BytesIO(word_file)document=ZipFile(word_file)xml_content=document.read('word/document.xml')print(xml_content.decode('utf-8'))word_obj=BeautifulSoup(xml_cointent.decode('utf-8'),features="html.parser")text_string=word_obj.findAll("w:t")fortext_eleintext_string:print(text_ele.text)if__name__=='__main__':ProcessCSVPDFDOCX().convert_docx_to_xml()的结果可能并不完美,但几乎相同。一行打印一个标签。总结本文主要讲解如何使用Python处理在线CSV、PDF、Word文档,由于目前没有很好的docx文档类库,如何曲线解析docx文件,通过本文可以处理大部分文档内容互联网。本文所有源码已托管在Github:https://github.com/sycct/Scra...如有任何问题,欢迎issue。