从SharePoint读取/下载Excel遇403错误,求解决方法
问题根源
你遇到的403错误核心来自两点:
- 认证方式不兼容:企业级SharePoint(如EY内部部署或SharePoint Online)基本不支持
HTTPBasicAuth,需用NTLM或OAuth2认证 - URL格式错误:当前链接里的
%10是错误编码(空格应编码为%20),且带:x:/r/的是预览链接,并非直接下载端点
修正步骤与解决方案
第一步:修正URL
先把链接中的%10替换为%20,再选以下两种有效URL格式之一:
- 直接下载链接:将预览链接的
:x:/r/改为:x:/d/,追加&download=1参数,示例:https://sites.ey.com/:x:/d/sites/TProjects-Analytics/Dgs/Analytics%20Analytics/Test.xlsx?d=w9d887d3b4ee579e35tdkka&download=1 - SharePoint API端点:使用服务器相对路径的API链接,示例:
https://sites.ey.com/sites/TProjects-Analytics/_api/web/getfilebyserverrelativeurl('/sites/TProjects-Analytics/Dgs/Analytics Analytics/Test.xlsx')/$value
第二步:选择对应认证方式
方案1:内部部署SharePoint(AD域环境)- NTLM认证
适合企业内部基于Active Directory的SharePoint,先安装依赖库:
pip install requests_ntlm pandas openpyxl
代码示例:
import requests from requests_ntlm import HttpNtlmAuth import pandas as pd # 替换为修正后的URL file_url = "https://sites.ey.com/:x:/d/sites/TProjects-Analytics/Dgs/Analytics%20Analytics/Test.xlsx?d=w9d887d3b4ee579e35tdkka&download=1" # AD域账号需加域名前缀,比如 EY\\abc 或完整邮箱(视域配置而定) username = "EY\\abc@gmail.com" password = "Password12@" # 发起请求并认证 resp = requests.get(file_url, auth=HttpNtlmAuth(username, password)) resp.raise_for_status() # 请求失败直接抛出异常 # 保存到本地 with open('Test.xlsx', 'wb') as f: f.write(resp.content) # 读取为DataFrame df = pd.read_excel('Test.xlsx', engine='openpyxl') print(df.head())
方案2:SharePoint Online(Office 365)- 专用库认证
适合云版SharePoint,使用官方推荐的库处理认证,先安装依赖:
pip install office365-rest-python-client pandas openpyxl
代码示例:
from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.user_credential import UserCredential import pandas as pd import io site_url = "https://sites.ey.com/sites/TProjects-Analytics" username = "abc@gmail.com" password = "Password12@" # 文件的服务器相对路径(从站点根目录开始) file_relative_path = "/sites/TProjects-Analytics/Dgs/Analytics Analytics/Test.xlsx" # 初始化SharePoint上下文 ctx = ClientContext(site_url).with_credentials(UserCredential(username, password)) # 获取文件内容 file_content = ctx.web.get_file_by_server_relative_url(file_relative_path).read().execute_query() # 保存到本地 with open('Test.xlsx', 'wb') as f: f.write(file_content) # 直接读取为DataFrame(无需保存本地) df = pd.read_excel(io.BytesIO(file_content), engine='openpyxl') print(df.head())
额外注意事项
- 权限验证:先在浏览器用相同账号打开文件链接,确认能正常下载,排除账号权限问题
- MFA影响:若账号开启多因素认证,上述密码认证方式失效,需改用设备码认证或应用权限(可参考
office365库的DeviceCodeCredential用法) - 编码检查:确保URL中所有特殊字符都正确编码(比如空格→
%20),避免URL解析错误
内容的提问来源于stack exchange,提问作者technical
相关产品推荐
相关产品推荐

