2011-09-26 12 views
7

Estoy trabajando en Python y tratando de recuperar datos de una hoja de cálculo pública de Google (this one), pero luchando un poco con the developer documentation.¿Recuperar datos de la hoja de cálculo pública de Google usando la biblioteca gdata?

Me gustaría evitar la autenticación del cliente si es posible, ya que es una hoja de cálculo pública.

Aquí está mi código actual, con la biblioteca gdata:

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

Esta falla en la línea 3 con BadStatusLine.

¿Cómo puedo leer los datos de la hoja de cálculo?

+0

Richard no está seguro si esto lo ayudará, pero podría exportar la hoja de cálculo como Excel y usar xlrd (http://pypi.python.org/pypi/xlrd) para leer los datos. –

+2

¡Gracias! Me gustaría usar gdata, pero la documentación es diabólica, nadie parece saber cómo usarla ... – Richard

Respuesta

17

Quiero comenzar haciendo eco de su opinión de que la Documentación es realmente pobre. Pero, esto es lo que he podido descifrar hasta ahora.

publicada del público

Es muy importante que la hoja de cálculo se "publicado en la web" en lugar de sólo ser "Público en la Web". El primero se logra yendo a la opción de menú "Archivo -> Publicar en la Web ...". El segundo se logra haciendo clic en el botón "Compartir" en la esquina superior izquierda de la hoja de cálculo.

Lo comprobé, y su hoja de cálculo con la clave = '0Atncguwd4yTedEx3Nzd2aUZyNmVmZGRHY3Nmb3I2ZXc' es solo "Pública en la web". Hice una copia para jugar con mi código de ejemplo. Mi copia tiene una clave = '0Aip8Kl9b7wdidFBzRGpEZkhoUlVPaEg2X0F2YWtwYkE' que verá más tarde en mi código de muestra.

Esta tontería de "Public on the Web" frente a "Published on The Web" es obviamente un punto de confusión común. En realidad está documentado en un recuadro rojo en las secciones "Visibilities and Projections" de la documentación principal de la API. Sin embargo, es realmente difícil leer ese documento.

Visibilidad y Proyecciones

Como dice el mismo documento, hay proyecciones que no sea "completa". Y, de hecho (indocumentado), "lleno" no parece funcionar bien con una visibilidad de "público", que también es importante establecer cuando se realizan llamadas no autenticadas.

Puede deducir del pydocs que muchos de los métodos en el objeto SpreadsheetsService pueden tomar los parámetros de "visibilidad" y "proyección". Solo sé de visibilidades "públicas" y "privadas". Si conoces otros, me gustaría saber sobre ellos también. Parece que "público" es lo que debe usar al realizar llamadas no autenticadas.

En cuanto a las proyecciones, es aún más complicado. Sé de proyecciones "completas", "básicas" y de "valores". Solo tuve suerte y encontré la proyección de "valores" leyendo el código fuente en la excelente biblioteca de JavaScript Tabletop. Y, adivina qué, ese es el ingrediente secreto que falta para que las cosas funcionen.

Código de Trabajo

Aquí hay un código que puede utilizar para consultar las hojas de trabajo de mi copia de la hoja de cálculo.

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

Consejos ** ** me resulta muy útil cuando se trabaja con las API de Python terriblemente documentados utilizar el método dir() en un intérprete de python en marcha para averiguar más sobre el tipo de información que pueda obtener de la pitón objetos. En este caso, no ayuda demasiado porque la abstracción sobre la API basada en XML y URL es bastante pobre.

Por cierto, estoy seguro de que querrás empezar a trabajar con los datos reales en la hoja de cálculo, así que continuaré y lanzaré un puntero más. Los datos de cada fila organizada como un diccionario se pueden encontrar usando GetListFeed (clave, hoja_clave, visibility = 'public', proyección = 'valores'). Entrada [0] .custom

Cuestiones relacionadas