关于 cnki-parse-results
用于从当前 CNKI 搜索结果页提取结构化论文信息的技能。面向需要快速整理结果列表及其作者、期刊和引用数据的用户。
主要功能
- 01读取搜索结果中的论文条目
- 02提取标题、作者与期刊
- 03获取日期、文献类型和引用数
- 04识别网络首发标记
适用场景
- 01汇总当前 CNKI 搜索结果
- 02比较结果中的期刊与发表日期
- 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.cbItem | value = 导出加密 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