上一期我们讲解了使用 Python 读取文档编码的相关问题,本期我们讲解使用 Python 处理 CSV、PDF、Word 文档相关内容。

CSV

我们进行网页采集的时候,你可能会遇到 CSV 文件,也可能项目需要将数据保存到 CSV 文件。Python 有一个超赞的标准库可以读写 CSV 文件。虽然这个库可以处理各种 CSV 文件,但是我们这里重点介绍标准 CSV 格式。

读取 CSV 文件

Python 的 CSV 主要是面向本地用户,也就是说你的 CSV 文件得保存到你的电脑上。而经行网络数据采集的时候,很多文件都是在线的。不过有一些方法可以解决这个问题:

  • 手动把 CSV 文件下载到本机,然后用 Python 定位文件位置;

  • 写 Python 程序下载文件,读取之后把源文件删除;

  • 从网上直接把文件读取成一个字符串,然后转换成一个 StringIO 对象,使它具有文件的属性。

虽然前两个方法也可以用,但是既然你可以轻易的把 CSV 文件保存到内存里,就不要下载到本地占用硬盘空间了。直接把文件读取成字符串,然后封装成 StringIO 对象,让 Python 把他当作文件来处理,就不需要保存成文件了。下面的程序就是从网上获取一个 CSV 文件,然后把每一行都打印到命令行里:

import requests
from io import StringIO
import csvclass ProcessCSVPDFDOCX(object):def __init__(self):self._csv_path = 'https://image.pdflibr.com/crawler/blog/country.CSV'self._session = requests.Session()def read_csv(self):response = self._session.get(self._csv_path)# 将文本设置成 utf-8 的编码方式response.encoding = 'utf-8'response_text = response.textdata_file = StringIO(response_text)dict_reader = csv.DictReader(data_file)print(dict_reader.fieldnames)for row in dict_reader:print(row)if __name__ == '__main__':ProcessCSVPDFDOCX().read_csv()

csv.DictReader 会返回把 CSV 文件每一行转化成 Python 的字典对象返回,而不是列表对象,并把字段列表保存到变量 dict_reader.fieldnames 里,字段同时作为字典对象的键。

PDF

从某种意义上来说, Adobe 在 1993 年发明 PDF 格式(Protable Document Format,便携式文档格式)是一种技术革命。PDF 可以让用户在不同系统上使用同样的方式查看图片和文本文档,无论这种文件是在那种系统上制作的。

虽然把 PDF 显示在网页上已经过时了(你已经可以把内容显示成 HTML 了,为什么还要这种静态、加载速度超慢的格式呢?),但是 PDF 仍然无处不在,尤其是在处理商务报表和表单的时候。

目前很多 PDF 解析库都是 Python 2.x 版本建立的,还没有迁移到 Python 3.x 版本。但是,因为 PDF 比较简单,而且开源的文档格式,所以一些给力的 Python 可以读取 PDF 文件,而且支持 Python 3.x 版本。

PDFMiner3K 就是一个非常好用的库(是 PDFMiner 的 Python 3.x 移植版)。他非常灵活,可以通过命令行使用,也可以整合到代码中。还可以处理不同的语言编码,而且对网络文件的处理也非常的方便。

你可以下载这个模块的源文件(pdfminer3k · PyPI),解压并用下面命令安装:

python setup.py install

我们也可以使用 pip 的方式安装:

pip install pdfminer3k

下面的例子可以把任意 PDF 读成字符串,然后使用 StringIO 转换成文件对象:

import requests
from io import StringIO
import csv
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.layout import LAParams
from pdfminer.converter import TextConverter
from urllib.request import urlopenclass ProcessCSVPDFDOCX(object):def __init__(self):self._session = requests.Session()self._pdf_path = 'https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'def read_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()return contentdef read_pdf_main(self):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 文件在电脑里,你就可以直接把 urlopen 返回的对象 pdf_file 换成普通的 open() 文件对象。

输入的结果可能不是很完美,尤其是当文件中包含图片、各种各样的文本格式,或者带有表格和数据图的时候。但是,对于大多数只包含纯文本内容的 PDF 而言,其输出结果与纯文本并没有什么区别。

微软 Word 和 .docx

网上有很多对 Word 吐槽的网友,Word 的特意功能就是把那些因该写成简单 TXT 或 PDF 格式的文件,变成了即大又慢且难以打开的怪兽,它们经常在系统切换和版本切换中出现格式不兼容,而且应为某些原因在文件内容已经定稿后仍处于可编辑状态。Word 文档从未打算让人频繁传递。不过他们在一些网站上很流行,包括重要的文档、信息,甚至图表和多媒体;总之,那些内容都应该使用 HTML 代替。

大约在 2008 年以前,微软 Office 产品中 Word 用 .doc 文件格式。这种二进制格式很难读取,而且能够读取 word 格式的软件很少。为了跟上时代,让自己的软件符合主流软件的标准,微软决定使用 Open Office 的类 XML 格式标准,此后新版本 Word 才能与其他文字处理软件兼容,这个格式就是 .docx

不过,Python 对这种 Google Docs、Open Office 和 Microsoft Office 都在使用的 .docx 格式支持还不够好。虽然有一个 python-docx 库,但是只支持创建和读取一些基本的数据,入文件大小和文件标题,不支持正文读取。如果想读取 Microsoft Office 文件的正文内容,我们需要自己动手找方法。

第一步是从文件读取 XML:

import requests
from io import StringIO
import csv
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.layout import LAParams
from pdfminer.converter import TextConverter
from urllib.request import urlopen
from io import open, BytesIO
from zipfile import ZipFileclass ProcessCSVPDFDOCX(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'def convert_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'))if __name__ == '__main__':ProcessCSVPDFDOCX().convert_docx_to_xml()

这段代码把远程 Word 读取成一个二进制文件对象(BytesIO 与上面使用的 StringIO 类似),再使用 Python 的标准库 zipfile 解压(所有的 .docx 文件为了节省空间都进行了压缩),然后对读取这个解压文件,就变成了 XML 了。

解压后的 XML 文件包含了大量信息,好在所有的内容都包含在 <w:t>标签里面,标题内容也是如此,这样就容易处理多了。

import requests
from io import StringIO
import csv
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.layout import LAParams
from pdfminer.converter import TextConverter
from urllib.request import urlopen
from io import open, BytesIO
from zipfile import ZipFile
from bs4 import BeautifulSoupclass ProcessCSVPDFDOCX(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'def convert_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_content.decode('utf-8'), features="html.parser")text_string = word_obj.findAll("w:t")for text_ele in text_string:print(text_ele.text)if __name__ == '__main__':ProcessCSVPDFDOCX().convert_docx_to_xml()

这段代码显示的结果可能并不完美,但是已经差不多了,一行打印一个 <w:t> 标签。

总结

这篇文章主要讲解了使用 Python 如何处理在线 CSV、PDF、Word 文档,由于 docx 文档并没有很好的库,如何曲线解析 docx 文件,通过这篇文章可以处理互联网上大部分文档内容。

这篇文章的所有源代码已经托管于 Github: https://github.com/sycct/Scrape_1_1.git

如果有任何问题,欢迎大家 issue。

爬虫系列:读取 CSV、PDF、Word 文档相关推荐

  1. Word电子扫描仪 word文档转换为图片Pdf,Word文档扫描成Pdf,word文档加密 word转图片 word转pdf

    Word文档转换为图片Pdf,Word文档扫描成Pdf Word转换为图片Pdf 1.        Word转换为Pdf,程序很多,但转换后的Pdf,还可以复制,虽可以加密禁止复制,但市场上太多的P ...

  2. 安卓使用POI读取及修改Word文档(.doc格式)

    前言:如果你可爱的项目经理要求安卓端的你来操作word实现各种功能,不要犹豫,直接动之以情晓之以理,因为这本来就是java的poi,安卓虽然源自java,但对于java的很多东西是不支持的,已有的各种 ...

  3. java读取带格式word文档_Java读取word文档解决方案

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java ...

  4. php activedocument-printout(),php二种读取和创建word文档方法

    PHP操作word文档的二种方法 方法一:利用php com模块 .也即利用word提供的本地api,所有只适用于windows系统上. view plaincopy to clipboardprin ...

  5. linux上php读取和创建word文档

    总结下本人在日常工作中使用php操作word的一些实战. 方法一:利用php com模块.也即利用word提供的本地api,所有只适用于windows系统上. [php] view plaincopy ...

  6. php读取和创建word文档

    总结下本人在日常工作中使用php操作word的一些实战. 方法一:利用php com模块.也即利用word提供的本地api,所有只适用于windows系统上. <?php $word = new ...

  7. C# 读取并显示word文档中的内容

    我想将信道模型的介绍以及分析的情况,都在C#的程序设计中进行实现.然后就想到了将word文档直接显示到窗体中,并且有滚动条可以拉动进行查看.搜集了一些资料之后找到了合适的方法--利用RichTextB ...

  8. Java 读取数据写入word文档并导出

    项目所遇到的问题,因项目需求从数据库中读取数据,并且写到word后导出该word文档. 话不多说,上代码 首先需要依赖的包: <dependency><groupId>org. ...

  9. IOS 预览pdf,word文档的集中方式

    在iPhone中可以很方便的预览文档文件,如:pdf.word等等,这篇文章将以PDF为例.介绍三种预览PDF的方式,又分别从本地pdf文档和网络上的pdf文档进行对比. 预览本地PDF文档: 1.使 ...

  10. php写入word文档内容,如何在PHP中读取和写入WORD文档

    因为加密等原因,如果直接用FILE后者OPEN等函数读取WORD的话往往是乱码,原来要使用COM 这是我简单的一个读取并存储到新的WORD上的文件 // 建立一个指向新COM组件的索引 $word = ...

最新文章

  1. [译文]Domain Driven Design Reference(五)—— 为战略设计的上下文映
  2. 关于微信公众号小程序在运营过程中的注意事项
  3. Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
  4. Python将list存为csv文件
  5. UI设计需要学习什么软件?
  6. Build your own distribution based on Fedora CoreOS
  7. Java中获取文件大小的正确方法
  8. JNIWrapper控件发布v3.8.4版本
  9. java day41【JSP 、MVC开发模式 、EL表达式 、JSTL标签 、三层架构】
  10. ffffffffffffffffff
  11. GDT 全局描述符表
  12. JAVA基本数据结构
  13. 软文诊断50期: 百度账号有什么推广功能?能编辑软文吗?
  14. 中文版Excel 2007公式与函数应用宝典
  15. 2022茶艺师(中级)考试题及答案
  16. 火盈云库浅谈新老版本的对比和发展过程
  17. WBADMIN 命令手册
  18. Hadoop 推测执行
  19. MySQL数据字典提示1146不存在的问题解决
  20. 一路狂奔的“幸运咖”,再造下一个“蜜雪冰城”?

热门文章

  1. 计算机对模具的影响,不容忽视 浅谈笔记本模具重要性
  2. 大智慧F10离线文件下载—大智慧V5.997下载
  3. HDU_最大报销额(DP)
  4. 基于数学形态学的道路裂缝病害检测
  5. Ubtun16.04 配置baxter机器人
  6. 主线程异常会导致 JVM 退出?
  7. 【java】对URL中的中文和符号进行UrlEncode转码
  8. TD-SCDMA风雨20年:中国3G标准的由来以及国家通信战略
  9. 在deepin20.6上运行ros和far planner
  10. 地址栏HTTPS怎么实现的