如何使用Python读取Google文档中的纯文本?
我正在尝试通过一个Python脚本读取Google文档的原始文本内容(只是普通文档,不是电子表格或演示文稿),但到目前为止还没有成功。
这是我尝试过的:
import gdata.docs.service
client = gdata.docs.service.DocsService()
client.ClientLogin('email', 'password')
q = gdata.docs.service.DocumentQuery()
q.AddNamedFolder('email', 'Folder Name')
feed = client.Query(q.ToUri())
doc = feed.entry[0] # extract one of the documents
然而,这个变量doc,类型是gdata.docs.DocumentListEntry,似乎不包含任何内容,只是关于文档的一些元信息。
我是不是做错了什么?有没有人能给我指个方向?谢谢!
2 个回答
更新(2019年3月) 好消息!现在可以使用Google Docs REST API了。关于它的更多信息,可以参考我在类似问题上的回答。为了帮助你入门,这里有一个官方的Python快速入门示例,教你如何获取Google文档的标题。
下面提到的Apps Script和Drive REST API的解决方案仍然有效,它们是获取Google文档内容的其他方法。(Drive API支持Python 2和3,但Apps Script仅支持JavaScript。)
总结:如果你想下载整个文档的纯文本,Drive API的解决方案是最好的。如果你想对文档的不同部分进行编程操作,那么你必须使用Docs API或Apps Script。
(2017年2月) 原帖中的代码和唯一的其他答案现在都过时了,因为ClientLogin认证在2012年就被弃用了,而GData API是Google API的前一代。虽然并不是所有的GData API都被弃用,但所有新的Google API都不使用Google数据协议。
目前没有可用的Google Docs文档的REST API,尽管有一个由Google Apps Script提供的“类似API”的服务,这是一个基于云的JavaScript解决方案,可以通过其DocumentService对象访问Google Docs,包括Docs附加组件。
如果你想从Google文档中读取纯文本,可以考虑使用文件级别的访问,这时你应该使用Google Drive API。以下是使用Drive API的示例:
(*) - 简而言之:将纯文本文件上传到Drive,导入/转换为Google Docs格式,然后将该文档导出为PDF。上面的帖子使用的是Drive API v2;这篇后续文章描述了如何迁移到Drive API v3,还有一个开发者视频结合了两个“穷人的转换器”帖子。
原帖的解决方案是执行与上面两个帖子中类似的操作,但确保使用的是text/plain
导出MIME类型。有关从Drive导入/导出其他格式的信息,请查看这个相关问题的回答以及从Drive下载文件的文档页面。以下是一些伪代码,它会在我的Drive文件夹中搜索名为“Hello World”的Google Docs文档,并在屏幕上显示找到的第一个匹配文件的内容(假设DRIVE是你的API服务端点):
from __future__ import print_function
NAME = 'Hello World'
MIME = 'text/plain'
# using Drive API v3; if using v2, change 'pageSize' to 'maxResults',
# 'name=' to 'title=', and ".get('files')" to ".get('items')"
res = DRIVE.files().list(q="name='%s'" % NAME, pageSize=1).execute().get('files')
if res:
fileID = res[0]['id'] # 1st matching "Hello World" name
res = DRIVE.files().export(fileId=fileID, mimeType=MIME).execute()
if res:
print(res.decode('utf-8')) # decode bytes for Py3; NOP for Py2
如果你需要更多信息,可以查看这些视频,了解如何使用Google API进行设置、OAuth2授权,以及创建Drive服务端点以列出你的Drive文件,还有一篇对应的博客文章。
想了解更多关于如何使用Python与Google API的信息,可以查看我的博客以及各种Google开发者视频(系列1和系列2)。
一个 DocumentQuery
不会把所有文档和它们的内容都返回给你——那样会花费很长时间。它只会返回一个文档的列表,并附带每个文档的一些基本信息(元数据)。其实,如果我没记错的话,你可以通过这种方式获取一个预览页面,所以如果你的文档只有一页,那可能就够用了……
接下来,你需要通过另一个请求来下载内容。content
元素有一个 type
(也就是MIME类型)和一个 src
(指向实际数据的URL)。你只需要下载这个 src
,然后解析它。不过,你可以通过添加一个 exportFormat
参数来覆盖默认的类型,这样就不需要进行解析了。
可以查看文档中的 下载文档和文件 部分,里面有个例子展示了如何下载文档并指定格式。(虽然是用 .NET 而不是 Python,而且使用的是 HTML 而不是纯文本,但你应该能搞明白的。)