前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >爬虫系列:读取 CSV、PDF、Word 文档

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

原创
作者头像
太后
发布于 2022-01-12 02:35:24
发布于 2022-01-12 02:35:24
3.2K0
举报
文章被收录于专栏:短信接收服务短信接收服务

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

CSV

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

读取 CSV 文件

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

  • 手动把 CSV 文件下载到本机,然后用 Python 定位文件位置;
  • 写 Python 程序下载文件,读取之后把源文件删除;
  • 从网上直接把文件读取成一个字符串,然后转换成一个 StringIO 对象,使它具有文件的属性。

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

代码语言:txt
AI代码解释
复制
import requests
代码语言:txt
AI代码解释
复制
from io import StringIO
代码语言:txt
AI代码解释
复制
import csv
代码语言:txt
AI代码解释
复制
class ProcessCSVPDFDOCX(object):
代码语言:txt
AI代码解释
复制
    def __init__(self):
代码语言:txt
AI代码解释
复制
        self._csv_path = 'https://image.pdflibr.com/crawler/blog/country.CSV'
代码语言:txt
AI代码解释
复制
        self._session = requests.Session()
代码语言:txt
AI代码解释
复制
    def read_csv(self):
代码语言:txt
AI代码解释
复制
        response = self._session.get(self._csv_path)
代码语言:txt
AI代码解释
复制
        # 将文本设置成 utf-8 的编码方式
代码语言:txt
AI代码解释
复制
        response.encoding = 'utf-8'
代码语言:txt
AI代码解释
复制
        response_text = response.text
代码语言:txt
AI代码解释
复制
        data_file = StringIO(response_text)
代码语言:txt
AI代码解释
复制
        dict_reader = csv.DictReader(data_file)
代码语言:txt
AI代码解释
复制
        print(dict_reader.fieldnames)
代码语言:txt
AI代码解释
复制
        for row in dict_reader:
代码语言:txt
AI代码解释
复制
            print(row)
代码语言:txt
AI代码解释
复制
if __name__ == '__main__':
代码语言:txt
AI代码解释
复制
    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 移植版)。他非常灵活,可以通过命令行使用,也可以整合到代码中。还可以处理不同的语言编码,而且对网络文件的处理也非常的方便。

你可以下载这个模块的源文件(https://pypi.org/project/pdfminer3k/),解压并用下面命令安装:

代码语言:txt
AI代码解释
复制
python setup.py install

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

代码语言:txt
AI代码解释
复制
pip install pdfminer3k

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

代码语言:txt
AI代码解释
复制
import requests
代码语言:txt
AI代码解释
复制
from io import StringIO
代码语言:txt
AI代码解释
复制
import csv
代码语言:txt
AI代码解释
复制
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
代码语言:txt
AI代码解释
复制
from pdfminer.layout import LAParams
代码语言:txt
AI代码解释
复制
from pdfminer.converter import TextConverter
代码语言:txt
AI代码解释
复制
from urllib.request import urlopen
代码语言:txt
AI代码解释
复制
class ProcessCSVPDFDOCX(object):
代码语言:txt
AI代码解释
复制
    def __init__(self):
代码语言:txt
AI代码解释
复制
        self._session = requests.Session()
代码语言:txt
AI代码解释
复制
        self._pdf_path = 'https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'
代码语言:txt
AI代码解释
复制
    def read_pdf(self, pdf_file):
代码语言:txt
AI代码解释
复制
        rscmgr = PDFResourceManager()
代码语言:txt
AI代码解释
复制
        retstr = StringIO()
代码语言:txt
AI代码解释
复制
        laparames = LAParams()
代码语言:txt
AI代码解释
复制
        device = TextConverter(rscmgr, retstr, laparams=laparames)
代码语言:txt
AI代码解释
复制
        process_pdf(rscmgr, device, pdf_file)
代码语言:txt
AI代码解释
复制
        device.close()
代码语言:txt
AI代码解释
复制
        content = retstr.getvalue()
代码语言:txt
AI代码解释
复制
        retstr.close()
代码语言:txt
AI代码解释
复制
        return content
代码语言:txt
AI代码解释
复制
    def read_pdf_main(self):
代码语言:txt
AI代码解释
复制
        pdf_file = urlopen(self._pdf_path)
代码语言:txt
AI代码解释
复制
        output_string = self.read_pdf(pdf_file)
代码语言:txt
AI代码解释
复制
        print(output_string)
代码语言:txt
AI代码解释
复制
        pdf_file.close()
代码语言:txt
AI代码解释
复制
if __name__ == '__main__':
代码语言:txt
AI代码解释
复制
    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:

代码语言:txt
AI代码解释
复制
import requests
代码语言:txt
AI代码解释
复制
from io import StringIO
代码语言:txt
AI代码解释
复制
import csv
代码语言:txt
AI代码解释
复制
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
代码语言:txt
AI代码解释
复制
from pdfminer.layout import LAParams
代码语言:txt
AI代码解释
复制
from pdfminer.converter import TextConverter
代码语言:txt
AI代码解释
复制
from urllib.request import urlopen
代码语言:txt
AI代码解释
复制
from io import open, BytesIO
代码语言:txt
AI代码解释
复制
from zipfile import ZipFile
代码语言:txt
AI代码解释
复制
class ProcessCSVPDFDOCX(object):
代码语言:txt
AI代码解释
复制
    def __init__(self):
代码语言:txt
AI代码解释
复制
        self._csv_path = 'https://image.pdflibr.com/crawler/blog/country.CSV'
代码语言:txt
AI代码解释
复制
        self._session = requests.Session()
代码语言:txt
AI代码解释
复制
        self._pdf_path = 'https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'
代码语言:txt
AI代码解释
复制
        self._docx_path = 'https://image.pdflibr.com/crawler/blog/test_document.docx'
代码语言:txt
AI代码解释
复制
    def convert_docx_to_xml(self):
代码语言:txt
AI代码解释
复制
        word_file = urlopen(self._docx_path).read()
代码语言:txt
AI代码解释
复制
        word_file = BytesIO(word_file)
代码语言:txt
AI代码解释
复制
        document = ZipFile(word_file)
代码语言:txt
AI代码解释
复制
        xml_content = document.read('word/document.xml')
代码语言:txt
AI代码解释
复制
        print(xml_content.decode('utf-8'))
代码语言:txt
AI代码解释
复制
if __name__ == '__main__':
代码语言:txt
AI代码解释
复制
    ProcessCSVPDFDOCX().convert_docx_to_xml()

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

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

代码语言:txt
AI代码解释
复制
import requests
代码语言:txt
AI代码解释
复制
from io import StringIO
代码语言:txt
AI代码解释
复制
import csv
代码语言:txt
AI代码解释
复制
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
代码语言:txt
AI代码解释
复制
from pdfminer.layout import LAParams
代码语言:txt
AI代码解释
复制
from pdfminer.converter import TextConverter
代码语言:txt
AI代码解释
复制
from urllib.request import urlopen
代码语言:txt
AI代码解释
复制
from io import open, BytesIO
代码语言:txt
AI代码解释
复制
from zipfile import ZipFile
代码语言:txt
AI代码解释
复制
from bs4 import BeautifulSoup
代码语言:txt
AI代码解释
复制
class ProcessCSVPDFDOCX(object):
代码语言:txt
AI代码解释
复制
    def __init__(self):
代码语言:txt
AI代码解释
复制
        self._csv_path = 'https://image.pdflibr.com/crawler/blog/country.CSV'
代码语言:txt
AI代码解释
复制
        self._session = requests.Session()
代码语言:txt
AI代码解释
复制
        self._pdf_path = 'https://image.pdflibr.com/crawler/blog/markdown-cheatsheet-online.pdf'
代码语言:txt
AI代码解释
复制
        self._docx_path = 'https://image.pdflibr.com/crawler/blog/test_document.docx'
代码语言:txt
AI代码解释
复制
    def convert_docx_to_xml(self):
代码语言:txt
AI代码解释
复制
        word_file = urlopen(self._docx_path).read()
代码语言:txt
AI代码解释
复制
        word_file = BytesIO(word_file)
代码语言:txt
AI代码解释
复制
        document = ZipFile(word_file)
代码语言:txt
AI代码解释
复制
        xml_content = document.read('word/document.xml')
代码语言:txt
AI代码解释
复制
        print(xml_content.decode('utf-8'))
代码语言:txt
AI代码解释
复制
        word_obj = BeautifulSoup(xml_content.decode('utf-8'), features="html.parser")
代码语言:txt
AI代码解释
复制
        text_string = word_obj.findAll("w:t")
代码语言:txt
AI代码解释
复制
        for text_ele in text_string:
代码语言:txt
AI代码解释
复制
            print(text_ele.text)
代码语言:txt
AI代码解释
复制
if __name__ == '__main__':
代码语言:txt
AI代码解释
复制
    ProcessCSVPDFDOCX().convert_docx_to_xml()

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

总结

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
PDF转Word完全免费?这么好的事情我怎么不知道????
现在网络上大部分的PDF转Word都是收费的,基本都是按页收费,有了我们的python代码后,我们就可以完全免费的将PDF转成Word了,这么好的福利我们赶紧来了解一下吧!
我被狗咬了
2019/09/23
8990
PDF转Word完全免费?这么好的事情我怎么不知道????
python提取pdf文本内容
Layout布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象,形成一个树结构。如图所示: 
周小董
2019/03/25
3.7K0
python提取pdf文本内容
60行Python代码,实现多线程PDF转Word
工作中经常会遇到需要提取PDF文件中文字的情况,一个PDF还好,复制粘贴一下也花不了太多时间,如果需要把大量PDF转为Word,怎么办呢?
simpleapples
2018/10/18
1K0
60行Python代码,实现多线程PDF转Word
秋季招聘季如何制作一款“秀色可餐”的简历?由ShareLatex和Python3打造
    说起简历模板,大家一定不会陌生,随便在百度搜关键词“简历模板”,林林总总的会出现一大片,但是这些简历模板往往都会有一个共同点,就是太Low、“土味”重、没有时代感、味同嚼蜡,蜡都要顺着嘴角流下来了,以一个求职者的视角来看待这些简历都会无奈心烦,更别说招聘者了。所以新时代的简历应该具备独特性、新颖、与众不同并且不落窠臼。
用户9127725
2022/08/08
3670
秋季招聘季如何制作一款“秀色可餐”的简历?由ShareLatex和Python3打造
基于Python实现对各种数据文件的操作
更多参考:https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files
1480
2019/07/10
2.5K0
基于Python实现对各种数据文件的操作
三大神器助力Python提取pdf文档信息
今天这篇文章是今年最后一篇文章了,因此也是一篇非常有用的技术文章,你可以现在只了解一下并进行收藏,等你需要用到的时候再拿出来看一看,这样就好了。
啃饼思录
2019/02/26
20.8K0
❤️ 6个Python办公黑科技,工作效率提升100倍!HR小姐姐都馋哭了(附代码)❤️
环境准备:python 3.6 、mac(下文中doc转docx是mac写法,windows更简单,导入win32的包即可)
不吃西红柿
2022/09/19
3680
❤️ 6个Python办公黑科技,工作效率提升100倍!HR小姐姐都馋哭了(附代码)❤️
手把手 | 20行Python代码教你批量将PDF转为Word
大数据文摘作品 投稿作者|丁彦军 在日常工作或学习中,经常会遇到这样的无奈: “小任,你把这个PDF中的文件码出来发我” 艹,倒霉,2M的PDF12点也完不了啊! 很多时候在学习时发现许多文档都是PDF格式,PDF格式却不利于学习使用,因此需要将PDF转换为Word文件,但或许你从网上下载了很多软件,但只能转换前五页(如WPS等),要不就是需要收费,那有没有免费的转换软件呢? so,我们给各位带来了一个免费简单快速的方法,手把手教你用Python批量处理PDF格式文件,获取自己想要的内容,存为word形式。
大数据文摘
2018/05/24
2K0
Python读取PDF内容
1,引言 晚上翻看《Python网络数据采集》这本书,看到读取PDF内容的代码,想起来前几天集搜客刚刚发布了一个抓取网页pdf内容的抓取规则,这个规则能够把pdf内容当成html来做网页抓取。神奇之处要归功于Firefox解析PDF的能力,能够把pdf格式转换成html标签,比如,div之类的标签,从而用GooSeeker网页抓取软件像抓普通网页一样抓取结构化内容。 从而产生了一个问题:用Python爬虫的话,能做到什么程度。下面将讲述一个实验过程和源代码。 2,把pdf转换成文本的Python源代码 下面的python源代码,读取pdf文件内容(互联网上的或是本地的),转换成文本,打印出来。这段代码主要用了一个第三方库PDFMiner3K把PDF读成字符串,然后用StringIO转换成文件对象。(源代码下载地址参看文章末尾的GitHub源)
py3study
2020/01/10
2.1K0
一个薪资double的捷径:自动化简历内推工具
最近,小编在处理简历时,发现大量简历需要一个个打开文件,复制姓名、邮箱、电话号码、学历等关键信息,效率特别低且部分文件无法直接复制。于是,小编便写了文件阅读工具的脚本,支持文件格式有:doc,docx,pdf。
不吃西红柿
2022/07/29
4870
Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比
pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本。
丹枫无迹
2019/01/22
19K1
攻防世界web进阶区FlatScience详解
判定POST提交的usr和pw是否存在,很显然usr处存在注入 这里提醒是sqlite数据库
wuming
2021/01/18
2.3K0
pdfminer将pdf转为csv
之前随便做了一下中金所杯的金融知识大赛的试题,低分飘过。看到复试名单,突然有一个想法,这个是pdf,万一有人想分析一下每个区域的人的分布,那怎么办。
钱塘小甲子
2019/01/28
1.5K0
python网络爬虫文档读取-微软Word文档和.docx
大约在2008年以前,微软Office产品中的Word用.doc文件格式。这种二进制格式很难读取,而且能够读取word格式软件很少。为了跟上时代,让自己的软件能够符合主流软件的标准,微软决定使用Open Office的类XML格式标准,此后新版Word文件才与其他文字处理软件兼容,这个格式就是.docx。
用户7886150
2021/01/15
1.4K0
攻防世界Web部分Wp
{"action":"buy","numbers":[true,true,true,true,true,true,true]}
用户5878089
2019/07/24
1.3K0
Python | PDF 提取文本的几种方法
常见的 PDF 文件可以分为两类:一种是文本转化而成(Text-Based),通常可以直接复制和粘贴;另一种是扫描文件而成(Scanned),比如影印书籍、插入图片制成的文件。依据此分类,将 Python 中处理 PDF 文件的第三方库可以简单归类:
PyStaData
2021/05/18
13K0
Python | PDF 提取文本的几种方法
一文贯通python文件读取
不论是数据分析还是机器学习,乃至于高大上的AI,数据源的获取是所有过程的入口。 数据源的存在形式多为数据库或者文件,如果把数据看做一种特殊格式的文件的话,即所有数据源都是文件。获得数据,就是读取文件的操作,文件有各种各样的格式即数据的组织形式,如何方便快捷地获取文件中的内容呢?
半吊子全栈工匠
2018/08/22
1.8K0
使用pdfminer解析pdf文件
最近要做个从 pdf 文件中抽取文本内容的工具,大概查了一下 python 里可以使用 pdfminer 来实现。下面就看看怎样使用吧。
kongxx
2018/12/27
1.8K0
python读取pdf提取文字和图片
如下图所示,一份pdf有几十页,每页九张图片, 提取出图片并用图片下方的文本对图片命名
诡途
2022/01/07
8K0
python读取pdf提取文字和图片
爬虫爬取英文文档存为PDF,在读取PDF自动翻译文档
这几天在爬了Python的官方文档,但是它里面全是英文,只有数字,没有汉字,原谅我这个英语渣渣搞不懂,只能靠翻译了,如果是复制到百度翻译的话太慢,耗时间。所以就直接用爬虫来搞了,自动化翻译文档
andrew_a
2019/07/30
1.5K0
爬虫爬取英文文档存为PDF,在读取PDF自动翻译文档
相关推荐
PDF转Word完全免费?这么好的事情我怎么不知道????
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档