mcpField
C
cnki-parse-results

cnki-parse-results

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

关于 cnki-parse-results

用于从当前 CNKI 搜索结果页提取结构化论文信息的技能。面向需要快速整理结果列表及其作者、期刊和引用数据的用户。

主要功能

  1. 01读取搜索结果中的论文条目
  2. 02提取标题、作者与期刊
  3. 03获取日期、文献类型和引用数
  4. 04识别网络首发标记

适用场景

  1. 01汇总当前 CNKI 搜索结果
  2. 02比较结果中的期刊与发表日期
  3. 03整理论文引用数和下载量

MCP 相关

此技能使用 Chrome DevTools MCP 检查当前页面,并通过 JavaScript 提取结果;页面结构不可用时可改用快照解析。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/cookjohn/cnki-skills --skill cnki-parse-results

安装后在 Claude Code 中输入/cnki-parse-results确认已加载。

详细介绍

CNKI 解析搜索结果

从当前 CNKI 搜索结果页面中提取论文结构化数据。

前提条件

当前 Chrome 页面必须是 CNKI 搜索结果页面(URL 包含 kns.cnki.net,且页面显示“条结果”)。

步骤

1. 确认当前页面是搜索结果页面

使用 mcp__chrome-devtools__take_snapshot。确认页面包含“条结果”。如果没有,告知用户当前未打开搜索结果页面。

检查是否有验证码(“拖动下方拼图完成验证”)——如果有,通知用户手动完成验证。

2. 通过 JavaScript 提取结果

使用 mcp__chrome-devtools__evaluate_script 和此函数:

() => {
  const rows = document.querySelectorAll('.result-table-list tbody tr');
  const checkboxes = document.querySelectorAll('.result-table-list tbody input.cbItem');
  const results = Array.from(rows).map((row, index) => {
    const nameCell = row.querySelector('td.name');
    const titleLink = nameCell?.querySelector('a.fz14');
    const authorCell = row.querySelector('td.author');
    const sourceCell = row.querySelector('td.source');
    const dateCell = row.querySelector('td.date');
    const dataCell = row.querySelector('td.data');
    const quoteCell = row.querySelector('td.quote');
    const downloadCell = row.querySelector('td.download');
    const isOnlineFirst = !!nameCell?.querySelector('.marktip');

    return {
      number: index + 1,
      title: titleLink?.innerText?.trim() || '',
      url: titleLink?.href || '',
      exportId: checkboxes[index]?.value || '',
      authors: Array.from(authorCell?.querySelectorAll('a.KnowledgeNetLink') || []).map(a => a.innerText?.trim()),
      journal: sourceCell?.querySelector('a')?.innerText?.trim() || '',
      date: dateCell?.innerText?.trim() || '',
      database: dataCell?.innerText?.trim() || '',
      citations: quoteCell?.innerText?.trim() || '',
      downloads: downloadCell?.innerText?.trim() || '',
      isOnlineFirst: isOnlineFirst
    };
  });

  const totalText = document.querySelector('.pagerTitleCell')?.innerText || '';
  const totalMatch = totalText.match(/([\d,]+)/);
  const pageInfo = document.querySelector('.countPageMark')?.innerText || '';

  return {
    papers: results,
    totalCount: totalMatch ? totalMatch[1] : 'unknown',
    pageInfo: pageInfo
  };
}
3. 展示结果

格式化为编号列表:

CNKI search results ({totalCount} total, page {pageInfo}):

1. {title} {isOnlineFirst ? "[网络首发]" : ""}
   Authors: {authors joined by "; "}
   Journal: {journal} | Date: {date} | Type: {database}
   Citations: {citations} | Downloads: {downloads}
   URL: {url}

2. ...
4. 备用方案:基于快照解析

如果 JavaScript 返回空结果(DOM 结构已更改),使用 mcp__chrome-devtools__take_snapshot 并手动解析无障碍树:

查找以下重复模式:

  • checkbox → StaticText(编号)→ URL 包含 kcms2/article/abstract 的 link(标题)→ URL 包含 kcms2/author/detail 的 link(作者)→ URL 包含 navi.cnki.net/knavi/detail 的 link(期刊)→ StaticText(日期)→ StaticText(数据库类型)

已验证的 DOM 选择器(CNKI 使用 jQuery,语义类名稳定)

数据项选择器说明
表格.result-table-list tbody tr每行对应一篇论文
复选框input.cbItemvalue = 导出加密 ID
编号td.seq行序号
标题td.name a.fz14论文标题链接
作者td.author a.KnowledgeNetLink作者姓名链接
期刊td.source a期刊/来源链接
日期td.date发布日期文本
数据库类型td.data数据库类型(期刊/学位论文)
引用次数td.quote引用次数
下载次数td.download下载次数
网络首发td.name .marktip“网络首发”标签
总数.pagerTitleCell“共找到 X 条结果”
页码.countPageMark“1/300” 格式

评论

支持 Markdown