这篇文章的脚本已发布到 Greasy Fork(油叉)平台,你可以前往 知网 参考文献 bibtex 天津大学 (greasyfork.org) 进行下载安装。后续脚本更新将在该平台更新。20230511
image.png


最近不是开始写毕业论文了嘛,使用到 LaTeX 进行写作。其中,导入参考文献部分需要以 BibTeX 格式写进模板中。

Google Scholar 网站上存在兼容 BibTeX 的参考文献信息,但是知网里没有这种格式的导出,这时就可以借助脚本实现这个功能。

这里分享我的魔改推导步骤,不想看过程的直接复制后文源码(DIFF 文件,记得删前面的 ± 号)。

注意

本篇文章的实现过程适用于天津大学校内登录用户,代码并不具有普遍性。各位读者可以根据思路自行改动。

不借助脚本实现 Bibtex 参考文献生成及标注方法

在介绍使用脚本方法之前先简要说明我之前的解决方案。

使用谷歌学术进行参考文献生成

通过以下几个步骤,可以轻松完成参考文献的生成。

  1. 在谷歌学术搜索中,点击学术搜索设置。
  2. 页面打开之后,在文献管理软件选项中选择显示导入 BibTeX 的链接,单击保存设置,退出。
  3. 在谷歌学术搜索中检索到文献后,在文献条目区域单击导入 BibTeX 选项,页面中出现文献的引用信息。
    image-20230511164837738

格式是这样的:

1
2
3
4
5
6
7
8
9
@article{刘娟2020基于,
title={基于 Python 爬虫的职位信息数据分析和可视化系统实现},
author={刘娟 and 管希东},
journal={Software Engineering and Applications},
volume={9},
pages={317},
year={2020},
publisher={中文学术期刊, 汉斯出版社, Hans Publishers}
}

转化知网 NoteExpress 文献导出格式

知网没有直接导出 BibTeX 文献导出格式的功能,但是有一个格式跟它很像。

  1. 在文章介绍页面点击导出参考文献

    image-20230511165242045

  2. 选择“更多引用格式”

    image-20230511165317189

  3. 选择 NoteExpress

    image-20230511165344333

对应着 BibTeX 的格式,你就可以自己写咯。

脚本解决

使用浏览器插件 Tampermonkey,在 Greasy Fork 中搜索脚本:

image-20230511165539516

读图片的介绍,知道该脚本的原理就是把知网 NodeExpress 格式进行转换,理解这一点方便我们进行后续的魔改

安装后,在知网文章介绍页面中会多出按钮,点击后 BibTeX 格式的参考文献会自动复制到粘贴板中。如果你试过了没有问题,那么本篇文章到此结束。

由于我使用的是学校账号打开的知网,知网的网址与相关接口都不一样,这个脚本就不会起作用。那么接下来就是魔改时刻。

魔改 1- 脚本需要匹配对应的网址

这个脚本只有在特定的地址才发挥作用,不然你会看不到上文图中多出的按钮。

因为我的知网文章首页地址是这样的:

1
https://<一堆字符>.eds.tju.edu.cn/kcms2/article/abstract<后面省略参数>

所以我就想办法增加这条规则:

1
https://<一堆字符>.eds.tju.edu.cn/kcms2/article/abstract*

添加的 URL 规则根据你的具体情况进行设计

方法 1:js 源代码修改

在源代码中增加这一行规则,ctrl+s 保存即可。

image-20230511171357098

方法 2:设置页面增加设定

打开 TamperMonkey 脚本管理界面,点击设置选项卡增加用户匹配:

image-20230511171717236

保存后重新访问文章简介页试试看,出现 BibTex 按钮此部分就成功了。

魔改 2- 使用正确的接口

经过上一步后,虽然出现了按钮,但不起作用。打开控制台会出现报错信息:

image-20230511172003104

看了一下脚本的源码,它发送的 POST 请求地址为:

1
https://kns.cnki.net/kns8/manage/APIGetExport

image-20230511170918257

这里的接口地址我们可以改一下。之前我们提到脚本原理就是读取知网 NoteExpress 格式进行 BibTeX 的转换。这里我通过抓包,得到接口的地址:

image-20230511172554301

那么我们就可以把这串地址粗暴的写进去。(注意配合通配符使用)

魔改 3- 使用正确的返回数据

改对了 POST 请求发送的地址还不够,该脚本不能正确解析返回数据。

返回的数据是字符串:

1
2
3
4
5
6
7
8
9
10
11
12
<ul class='literature-list'>
<li>
{Reference Type}: Journal Article<br>
{Title}: Flask框架在数据可视化的应用<br>
{Author}: 陈嘉发;黄宇靖;<br>
{Author Address}: 惠州卫生职业技术学院教育技术与信息中心;<br>
{Journal}: 福建电脑<br>
...
{Database Provider}: CNKI<br>
</li>
</ul>
<input id="traceid" type="hidden" value="cf4aca8f33f5471f9c383ebf93578d2f.227.16837969341201267">

经过调试与源码推测我们需要的是 <li> 标签中的内容。

对应的正则表达式为:(附工具:正则表达式在线测试 | 菜鸟工具 (runoob.com)

1
/(?<=<li>).*(?=</li>)/g

对应的 js 语句(多了个转义符 \):

1
var ss = data.match(/(?<=<li>).*(?=<\/li>)/g)

一顿编辑源码与 BUG 修复就 OK 了(具体编辑看 DIFF 文件)!

使用效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@article{cite_label,
title={flask框架在数据可视化的应用},
author={陈嘉发;黄宇靖;},
authoraddress={惠州卫生职业技术学院教育技术与信息中心;},
journal={福建电脑},
year={2022},
volume={38},
number={12},
pages={44-48},
keywords={flask框架;python爬虫;数据可视化图表库},
abstract={我就省略了,一大串的},
isbn/issn={1673-2782},
notes={35-1115/tp},
doi={10.16707/j.cnki.fjpc.2022.12.009},
databaseprovider={cnki},
}

提一点,在我的模板中,cite_label 不能是中文,否则编译出错。我使用的是天津大学毕业论文模板:嵌入式软件工程实验室/天津大学本科毕业论文 Latex 模板 - 码云 - 开源中国 (gitee.com)

源码

此处不再更新,新版本请前往 Greasy Fork 平台进行下载安装。DIFF 文件进提供修改参考。

diff 文件。把减号行删除,删除加号行的加号即可得目的源文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// ==UserScript==
// @name 知网 参考文献 bibtex
// @namespace https://github.com/HawkTom
// @require https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js
// @version 1.1.1
// @description 从知网文献中直接复制bibtex
- // @author Hao
+ // @author Hao, uuanqin
// @match https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=*
// @match http://kns.cnki.net/kcms/detail/detail.aspx?dbcode=*
+ // @match https://*.eds.tju.edu.cn/kcms2/article/abstract*
// @grant none
// ==/UserScript==

(function() {
'use strict';

jQuery(document).ready(function($) {

window.onload = function(){

var a = document.getElementById("paramdbname")
var b = document.getElementById("paramfilename")
var fileid = a.getAttribute("value") + '!' + b.getAttribute("value") +'!1!0'

var x = document.getElementsByClassName("btn-tool")
var input = document.createElement('li')
input.setAttribute("id", "bibbtn")
input.setAttribute("class", "btn-quote")
//input.setAttribute("type", "button")
input.setAttribute("title", "Bibtex")
//input.setAttribute("onclick", "func(this)") href=\"javascript:void(0)\" onclick=\"getBib()\
input.innerHTML = "<a><i></i>Bibtex</a>"
x[0].children[0].append(input)

$("#bibbtn").click(function(){
+ var url = window.location.hostname; // 得到 *.eds.tju.edu.cn
- $.post("https://kns.cnki.net/kns8/manage/APIGetExport",
+ $.post(`https://${url}/kns8/manage/ShowExport`,
{
filename:fileid,
displaymode:"NoteExpress"
},
function(data){
console.log(data);
var bibtext = ""
- var ss = data.data[0].value[0]
- var ssl = ss.split("<br>")
+ var ss = data.match(/(?<=<li>).*(?=<\/li>)/g) // .data[0].value[0]
+ console.log(ss); // 输出调试而已
+ var ssl = ss[0].split("<br>")
for (var i=0; i<ssl.length-1; i++){
var k = ssl[i].toLocaleLowerCase().split(" ").join("").split(":")
var item = k[0]
var detail = k[1]
if (item == "{referencetype}"){
if (detail == "journalarticle"){
bibtext = "@article{cite_label ,\n"
}
else if(detail == "conferenceproceedings"){
bibtext = "@inproceedings{cite_label ,\n"
}
}
else if(item == "{issue}"){
- bibtext = bibtext + " {number}={" + detail + "},\n"
+ bibtext = bibtext + " number={" + detail + "},\n" // 不明白这里的number为什么要括起来
}
else {
bibtext = bibtext + " " + item.substr(1, item.length-2) + "={" + detail + "},\n"
}
}
bibtext += "}"
//console.log(bibtext)
const copad = document.createElement('textarea')
copad.value = bibtext
document.body.appendChild(copad)
copad.select()
document.execCommand('Copy')
document.body.removeChild(copad)
});
})
};
})
})();

后记

作者本人已顺利从天大毕业,相关校园网账号已封禁,因此无法再对此脚本进行测试与维护。

本文参考