如何使用gdata库从公共Google表格中获取数据?
我正在用Python工作,想从一个公开的Google电子表格中获取数据(这个),但是在查看开发者文档时遇到了一些困难。
我希望尽量避免客户端认证,因为这是一个公开的电子表格。
这是我现在的代码,使用了gdata库:
client = gdata.spreadsheet.service.SpreadsheetsService()
key = '0Atncguwd4yTedEx3Nzd2aUZyNmVmZGRHY3Nmb3I2ZXc'
worksheets_feed = client.GetWorksheetsFeed(key)
在第3行时出现了BadStatusLine的错误。
我该如何从这个电子表格中读取数据呢?
1 个回答
我想先说说你的感受,确实文档写得很糟糕。不过,我到目前为止能弄明白的事情是这样的。
发布与公开
你的电子表格必须是“发布到网络”,而不是仅仅“在网上公开”。前者是通过点击“文件 -> 发布到网络...”这个菜单来实现的。后者则是通过点击电子表格左上角的“分享”按钮来完成的。
我检查了一下,你的电子表格,关键字是 '0Atncguwd4yTedEx3Nzd2aUZyNmVmZGRHY3Nmb3I2ZXc',它只是“在网上公开”。我复制了一份来做我的示例代码。我的复制版的关键字是 '0Aip8Kl9b7wdidFBzRGpEZkhoUlVPaEg2X0F2YWtwYkE',你会在我后面的示例代码中看到它。
这个“在网上公开”和“发布到网络”的区别显然让很多人感到困惑。其实在主API文档的“可见性和投影”部分有说明,不过那份文档真的很难读。
可见性和投影
正如那份文档所说,除了“完整”之外,还有其他的投影。实际上(虽然没有文档说明),“完整”似乎和“公开”的可见性不太兼容,而设置这个可见性在进行未认证的调用时也很重要。
你可以从pydocs中了解到,SpreadsheetsService对象的许多方法可以接受“可见性”和“投影”参数。我只知道“公开”和“私有”这两种可见性。如果你知道其他的,也请告诉我。看起来在进行未认证的调用时,应该使用“公开”。
至于投影,这就更复杂了。我知道有“完整”、“基本”和“值”这几种投影。我是通过阅读优秀的Tabletop JavaScript库的源代码才偶然发现了“值”这个投影。猜猜看,这就是让事情运作的秘密成分。
有效代码
这里有一些代码,你可以用来查询我复制的电子表格中的工作表。
#!/usr/bin/python
from gdata.spreadsheet.service import SpreadsheetsService
key = '0Aip8Kl9b7wdidFBzRGpEZkhoUlVPaEg2X0F2YWtwYkE'
client = SpreadsheetsService()
feed = client.GetWorksheetsFeed(key, visibility='public', projection='basic')
for sheet in feed.entry:
print sheet.title.text
** 小贴士 ** 在处理文档不太好的Python API时,我发现使用dir()方法在运行的Python解释器中查看对象的信息非常有帮助。不过在这个情况下,它帮助不大,因为在XML和基于URL的API之上的抽象层次很差。
顺便说一下,我相信你会想开始处理电子表格中的实际数据,所以我再给你一个提示。每一行的数据以字典的形式组织,可以通过GetListFeed(key, sheet_key, visibility='public', projection='values').entry[0].custom来找到。