关于 wos-parse-results
WoS Parse Results 是用于从 Web of Science 检索结果中提取结构化记录的内部技能。它优先解析检索 API 的 NDJSON 响应,并在无法访问 API 时使用 DOM 抓取作为备用方案。
主要功能
- 01解析 NDJSON API 响应
- 02提取结构化检索记录
- 03使用 DOM 抓取作为备用
- 04优先采用结构化数据
适用场景
- 01处理 Web of Science API 结果
- 02从已打开的结果页提取记录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ cookjohn/ wos-skills --skill wos-parse-results安装后在 Claude Code 中输入/wos-parse-results确认已加载。
详细介绍
WoS 解析结果
用于从 WoS 中提取结构化数据的内部技能。有两种模式:API 响应解析(首选)或 DOM 抓取(备用)。
模式 A:API 响应解析(首选)
使用 runQuerySearch API 时,响应为 NDJSON。请从 records 负载中解析记录:
// Parse NDJSON response text
const lines = text.trim().split('\n').map(l => { try { return JSON.parse(l); } catch(e) { return null; } }).filter(Boolean);
const searchInfo = lines.find(l => l.key === 'searchInfo')?.payload;
const recordsData = lines.find(l => l.key === 'records')?.payload;
const records = Object.entries(recordsData).map(([idx, rec]) => ({
idx: parseInt(idx),
wosId: rec.colluid,
title: rec.titles?.item?.en?.[0]?.title || '',
authors: rec.names?.author?.en?.filter(Boolean).map(a => a.wos_standard).join('; ') || '',
source: rec.titles?.source?.en?.[0]?.title || '',
year: rec.pub_info?.pubyear || '',
vol: rec.pub_info?.vol || '',
issue: rec.pub_info?.issue || '',
pages: rec.pub_info?.page_no || '',
doi: rec.doi || '',
citations: rec.citation_related?.counts?.WOSCC || 0,
citationsAll: rec.citation_related?.counts?.ALLDB || 0,
refCount: rec.ref_count || 0,
abstract: rec.abstract?.basic?.en?.abstract?.replace(/<[^>]*>/g, '') || '',
docType: rec.doctypes?.[0] || '',
oa: rec.oa || false
}));
模式 B:DOM 抓取(备用)
浏览器位于结果页面且 API 不可用时:
async () => {
for (let i = 0; i < 20; i++) {
if (document.querySelector('app-record')) break;
await new Promise(r => setTimeout(r, 500));
}
const records = [...document.querySelectorAll('app-record')].map((rec, idx) => {
const titleEl = rec.querySelector('a[data-ta="summary-record-title-link"]');
const title = titleEl?.textContent?.trim() || '';
const href = titleEl?.href || '';
const wosId = href.match(/WOS:\w+/)?.[0] || '';
const authorEls = rec.querySelectorAll('a[data-ta*="DisplayName-author"]');
const authors = [...authorEls].map(a => a.textContent?.trim()).join('; ');
const sourceEl = rec.querySelector('a[data-ta="jcr-link-menu"]');
const source = sourceEl?.textContent?.trim()?.replace('arrow_drop_down', '') || '';
const citedEl = rec.querySelector('a[data-ta="stat-number-citation-related-count"]');
const citations = citedEl?.textContent?.trim() || '0';
return { idx: idx + 1, title, wosId, authors, source, citations };
});
return { status: 'ok', recordCount: records.length, records };
}
注意事项
- 始终优先使用模式 A——结构化 JSON,不存在选择器脆弱性
- 当已位于结果页面且无法访问 API 时,使用模式 B 作为备用方案
- 由于延迟加载或动态渲染,DOM 选择器可能会遗漏记录
评论
支持 Markdown