Получить данные из общедоступной таблицы Google, используя библиотеку gdata? - PullRequest
7 голосов
/ 27 сентября 2011

Я работаю в Python и пытаюсь получить данные из общедоступной электронной таблицы Google ( эта ), но немного борюсь с документацией разработчика .

Я бы хотел избежать аутентификации клиента, если это возможно, так как это общедоступная электронная таблица.

Вот мой текущий код с библиотекой gdata:

client = gdata.spreadsheet.service.SpreadsheetsService()  
key = '0Atncguwd4yTedEx3Nzd2aUZyNmVmZGRHY3Nmb3I2ZXc'  
worksheets_feed = client.GetWorksheetsFeed(key)  

Сбой в строке 3 с BadStatusLine.

Как я могу прочитать данные из электронной таблицы?

1 Ответ

17 голосов
/ 20 августа 2012

Я хочу начать с повторения вашего чувства, что Документация действительно плохая.Но вот то, что я смог выяснить до сих пор.

Публичная публикация

Очень важно, чтобы ваша электронная таблица была "опубликована в Интернете"в отличие от того, чтобы быть просто «публичным в сети».Первое достигается путем перехода в пункт меню «Файл -> Опубликовать в Интернете ...».Второе достигается нажатием кнопки «Поделиться» в верхнем левом углу электронной таблицы.

Я проверил, и ваша электронная таблица с ключом = '0Atncguwd4yTedEx3Nzd2aUZyNmVmZGRHY3Nmb3I2ZXc' является только "Общедоступной в Интернете".Я сделал его копию, чтобы поиграться с примером кода.Моя копия имеет ключ = '0Aip8Kl9b7wdidFBzRGpEZkhoUlVPaEg2X0F2YWtwYkE', который вы увидите в моем образце кода позже.

Эта бессмысленная «публикация в Интернете» против «опубликованных в интернете», очевидно, является предметом общей путаницы.На самом деле он задокументирован в красной рамке в разделах «Видимости и проекции» основной документации API.Однако читать этот документ действительно сложно.

Видимость и прогнозы

Как говорится в том же документе, существуют и другие проекции, кроме "полного".И на самом деле (недокументированное) «full», похоже, не очень хорошо работает с видимостью «public», которую также важно установить при совершении вызовов без аутентификации.

Вы можете что-то подобрать из pydocs , что многие методы объекта SpreadsheetsService могут принимать параметры «видимости» и «проекции».Я знаю только "публичную" и "приватную" видимости.Если вы узнаете о каких-либо других, я бы тоже хотел узнать о них.Кажется, что "public" - это то, что вы должны использовать при совершении вызовов без аутентификации.

Что касается проекций, это еще сложнее.Я знаю о «полной», «базовой» и «ценностной» проекциях.Мне повезло, и я нашел проекцию «ценностей», прочитав исходный код превосходной библиотеки JavaScript Tabletop .И, угадайте что, это секретный недостающий ингредиент, чтобы заставить вещи работать.

Рабочий код

Вот код, который вы можете использовать для запроса рабочих листов из моей копииВаша электронная таблица.

#!/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

** Советы ** Мне действительно полезно работать с ужасно документированными API-интерфейсами Python, чтобы использовать метод dir () в работающем интерпретаторе Python, чтобы выяснить это.больше о том, какую информацию я могу получить от объектов Python.В этом случае это не очень помогает, потому что абстракция над API на основе XML и URL довольно скудна.

Кстати, я уверен, что вы захотите начать работать с реальнымиданных в таблице, поэтому я продолжу и добавлю еще один указатель.Данные для каждой строки, организованной в виде словаря, можно найти с помощью GetListFeed (ключ, sheet_key, visibility = 'public', projection = 'values'). Entry [0] .custom

...