如何用Python通过URL提取Google Docs中的表格数据
从公开Google Docs提取表格的两种有效方法
方法一:网页解析(无需API密钥)
你的Google Docs链接是公开发布状态(以/pub结尾),可以直接抓取网页HTML,通过解析表格标签提取数据,无需配置API权限。
步骤:
- 安装所需依赖:
pip install requests beautifulsoup4 pandas
- 运行以下代码提取表格:
import requests from bs4 import BeautifulSoup import pandas as pd # 目标文档链接 doc_url = "https://docs.google.com/document/d/e/2PACX-1vSHesOf9hv2sPOntssYrEdubmMQm8lwjfwv6NPjjmIRYs_FOYXtqrYgjh85jBUebK9swPXh_a5TJ5Kl/pub" # 可选:添加请求头避免被拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 获取网页内容 response = requests.get(doc_url, headers=headers) response.raise_for_status() # 捕获请求失败的异常 # 解析HTML结构 soup = BeautifulSoup(response.text, 'html.parser') # 提取所有表格 tables = soup.find_all('table') # 处理每个表格并输出/保存 for table_idx, table in enumerate(tables, 1): # 提取表头 header_cells = table.find_all('th') headers = [cell.get_text(strip=True) for cell in header_cells] # 提取表格行数据 rows = [] for row in table.find_all('tr')[1:]: # 跳过表头行 cell_texts = [cell.get_text(strip=True) for cell in row.find_all('td')] if cell_texts: # 跳过空行 rows.append(cell_texts) # 转换为DataFrame方便处理 df = pd.DataFrame(rows, columns=headers if headers else None) print(f"第{table_idx}个表格:") print(df) # 可选:保存为CSV文件 df.to_csv(f"google_docs_table_{table_idx}.csv", index=False)
如果之前用requests报错,大概率是未添加请求头导致被Google拦截,加上上述headers参数即可解决。
方法二:Google Docs API(精准提取)
如果需要更精准的结构化数据,可使用官方API,但需正确配置授权:
准备工作:
- 登录Google Cloud控制台,创建新项目并启用Google Docs API
- 创建服务账号,下载JSON格式的密钥文件
- 将服务账号的邮箱地址添加到目标Google Docs的共享列表中,授予查看权限
步骤:
- 安装依赖:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib pandas
- 运行以下代码:
from google.oauth2 import service_account from googleapiclient.discovery import build import pandas as pd # 替换为你的服务账号密钥文件路径 SERVICE_ACCOUNT_KEY_PATH = "your-service-account-key.json" # 从文档链接中提取的文档ID DOCUMENT_ID = "2PACX-1vSHesOf9hv2sPOntssYrEdubmMQm8lwjfwv6NPjjmIRYs_FOYXtqrYgjh85jBUebK9swPXh_a5TJ5Kl" # 配置授权范围 SCOPES = ["https://www.googleapis.com/auth/documents.readonly"] creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES ) # 构建API客户端 service = build("docs", "v1", credentials=creds) # 获取文档内容 document = service.documents().get(documentId=DOCUMENT_ID).execute() content = document["body"]["content"] # 提取表格数据 tables_data = [] for elem in content: if "table" in elem: table = elem["table"] table_rows = [] # 遍历表格的每一行 for row in table["tableRows"]: cell_contents = [] # 遍历行内的每个单元格 for cell in row["tableCells"]: cell_text = "" # 提取单元格内的文本内容 for cell_content in cell["content"]: if "paragraph" in cell_content: for para_elem in cell_content["paragraph"]["elements"]: if "textRun" in para_elem: cell_text += para_elem["textRun"]["content"].strip() cell_contents.append(cell_text) table_rows.append(cell_contents) tables_data.append(table_rows) # 转换为DataFrame并输出 for idx, table in enumerate(tables_data, 1): # 第一行作为表头,其余作为数据行 df = pd.DataFrame(table[1:], columns=table[0]) print(f"第{idx}个表格:") print(df) df.to_csv(f"docs_api_table_{idx}.csv", index=False)
之前使用API报错,常见原因包括:未启用Docs API、服务账号无文档访问权限、密钥路径错误或文档ID提取错误,对照上述步骤检查即可解决。
内容的提问来源于stack exchange,提问作者user27223877
相关产品推荐
相关产品推荐

