如何用Google Spreadsheet ImportXML获取FamilySearch动态生成的Note列档案数据
解决Google Sheets ImportXML无法获取FamilySearch动态加载档案列表的问题
嘿,这个问题我碰到过好多次——Google Sheets的IMPORTXML确实搞不定JS动态生成的内容,因为它只会抓取页面刚加载时的静态HTML,根本不会运行页面上的JavaScript。不过针对FamilySearch这个站点,有几个靠谱的办法能拿到你要的「Note」下的档案列表:
方法1:直接抓取站点API(最推荐)
大部分动态内容都是通过后台API加载的,咱们可以直接找这个API端点来拿数据:
- 打开目标页面,按F12调出开发者工具,切换到「Network」标签,勾选「XHR/Fetch」过滤项
- 刷新页面,找类似
/api/catalog/records/[ID]格式的请求(你的例子里ID是966883) - 点击这个请求,查看「Response」标签,里面大概率能找到包含「Note」内容的字段(比如
note或description) - 复制这个API的完整URL,在Google Sheets里用
IMPORTDATA()函数直接请求,或者用IMPORTJSON自定义函数(需要先安装)来解析JSON格式的响应
如果API需要认证,别慌,FamilySearch的公开 catalog 数据一般不需要登录就能访问,只要请求头里带上正常的User-Agent就行。
方法2:用Google Apps Script提取页面预加载数据
很多站点会把初始数据塞进页面的<script>标签里(比如window.__INITIAL_STATE__),咱们可以写个简单的脚本提取:
- 打开你的Google Sheet,点击「扩展程序」→「Apps 脚本」
- 替换默认代码为以下内容:
function getFamilySearchNote(url) { // 设置请求头模拟浏览器,避免被反爬 const requestOptions = { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } }; try { const pageHtml = UrlFetchApp.fetch(url, requestOptions).getContentText(); // 匹配包含Note内容的脚本片段(需要根据实际页面调整正则) const noteMatch = pageHtml.match(/"note":"([^"]+)"/); if (noteMatch) { // 处理转义字符,还原原始内容 let rawNote = noteMatch[1].replace(/\\"/g, '"').replace(/\\n/g, '\n'); // 提取只包含档案编号的行(比如以「Ф.」开头的行) const recordList = rawNote.split('\n').filter(line => line.trim().startsWith('Ф.')); return recordList.join('\n'); } return '未找到Note内容'; } catch (error) { return `获取失败:${error.message}`; } }
- 保存脚本,回到Sheet里输入公式:
=getFamilySearchNote("https://www.familysearch.org/search/catalog/966883?availability=Family%20History%20Library"),就能拿到你要的档案列表了
注意事项
- 正则表达式可能需要根据不同的catalog页面调整,毕竟FamilySearch的内容格式偶尔会变
- 不要频繁请求,避免触发站点的反爬机制
- 如果页面没有预加载数据,那可能需要用能渲染JavaScript的工具(比如Puppeteer),不过这个需要配合Google Cloud Functions,门槛稍高
内容的提问来源于stack exchange,提问作者vasja pupkin
相关产品推荐
相关产品推荐

