You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用shareplum无法从_Folder对象获取自定义列数据的问询

解决SharePlum中Folder层级获取自定义列元数据的问题

核心原因

SharePlum的_Folder对象调用的是SharePoint的Folder API端点,仅返回基础文件/文件夹元数据;而List.get_list_items()调用的是List Items API端点,能拉取包括自定义列在内的完整字段集合。要在Folder层级获取完整数据,需要结合两者的能力。

两种可行方案

方案1:利用List接口+路径过滤(快速实现)

直接通过Documents列表的get_list_items()获取全量数据,再用文件夹路径过滤目标内容:

  1. 获取Documents列表对象
documents = site.List('Documents')
  1. 拉取包含自定义列的所有列表项(指定需要的字段,包括系统字段和自定义列)
# FileSystemObjectType用于区分:0=文件,1=文件夹
all_items = documents.get_list_items(
    fields=['ID', 'Title', 'FileDirRef', 'monkey', 'woohoo', 'FileSystemObjectType']
)
  1. 筛选目标文件夹下的内容
target_folder = "Shared Documents/Test_Library"
folder_full_items = [
    item for item in all_items 
    if item['FileDirRef'].endswith(target_folder)
]

folder_full_items中会包含该文件夹下所有文件/文件夹的完整元数据(含自定义列)。

方案2:扩展_Folder类(面向对象封装)

给_Folder类添加自定义方法,直接通过Folder对象获取完整数据:

from shareplum import _Folder

def get_full_metadata(self):
    # 获取当前Folder所属的List对象
    parent_list = self.site.List(self.list_title)
    # 构造查询,过滤当前文件夹的所有项
    query = {
        "Query": {
            "Where": {
                "Eq": {
                    "FieldRef": {"Name": "FileDirRef"},
                    "Value": {"Type": "Text", "Value": self.serverRelativeUrl}
                }
            }
        }
    }
    # 返回包含自定义列的完整数据
    return parent_list.get_list_items(
        query=query,
        fields=['ID', 'Title', 'monkey', 'woohoo', 'FileSystemObjectType']
    )

# 给_Folder类动态添加方法
_Folder.get_full_metadata = get_full_metadata

使用时直接调用:

folder = site.Folder("Shared Documents/Test_Library")
full_metadata = folder.get_full_metadata()

爬虫搭建建议

  1. 先用_Folder的folders属性递归遍历站点所有文件夹路径,构建完整的目录结构
  2. 对每个文件夹路径,用上述方案获取对应的完整元数据(文件+文件夹)
  3. 处理大型列表时,给get_list_items()添加分页参数(rowlimit和query的分页逻辑),避免一次性拉取过多数据

内容的提问来源于stack exchange,提问作者Pablo_le_Vicieux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:12:54