mcpField
W
wos-parse-results

wos-parse-results

github.com/cookjohn生产力13050 次安装33 周前更新
代码仓库

关于 wos-parse-results

WoS Parse Results 是用于从 Web of Science 检索结果中提取结构化记录的内部技能。它优先解析检索 API 的 NDJSON 响应,并在无法访问 API 时使用 DOM 抓取作为备用方案。

主要功能

  1. 01解析 NDJSON API 响应
  2. 02提取结构化检索记录
  3. 03使用 DOM 抓取作为备用
  4. 04优先采用结构化数据

适用场景

  1. 01处理 Web of Science API 结果
  2. 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