这篇文章的脚本已发布到 Greasy Fork(油叉)平台,你可以前往 知网 参考文献 bibtex 天津大学 (greasyfork.org) 进行下载安装。后续脚本更新将在该平台更新。230511
最近不是开始写毕业论文了嘛,使用到 LaTeX 进行写作。其中,导入参考文献部分需要以 BibTeX 格式写进模板中。
Google Scholar 网站上存在兼容 BibTeX 的参考文献信息,但是知网里没有这种格式的导出,这时就可以借助脚本实现这个功能。
这里分享我的魔改推导步骤,不想看过程的直接复制后文源码(DIFF 文件,记得删前面的 ± 号)。
本文仅适用于天津大学校内登录用户,代码并不具有普遍性。各位读者可以根据思路自行改动。
不借助脚本实现 Bibtex 参考文献生成及标注方法
在介绍使用脚本方法之前先简要说明我之前的解决方案。
使用谷歌学术进行参考文献生成
通过以下几个步骤,可以轻松完成参考文献的生成。
在谷歌学术搜索中,点击学术搜索设置。
页面打开之后,在文献管理软件选项中选择显示导入 BibTeX 的链接,单击保存设置,退出。
在谷歌学术搜索中检索到文献后,在文献条目区域单击导入 BibTeX 选项,页面中出现文献的引用信息。
格式是这样的:
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 文献导出格式的功能,但是有一个格式跟它很像。
在文章介绍页面点击导出参考文献
选择“更多引用格式”
选择 NoteExpress
对应着 BibTeX 的格式,你就可以自己写咯。
脚本解决
使用浏览器插件 Tampermonkey,在 Greasy Fork 中搜索脚本:
读图片的介绍,知道该脚本的原理就是把知网 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 保存即可。
方法 2:设置页面增加设定
打开 TamperMonkey 脚本管理界面,点击设置选项卡增加用户匹配:
保存后重新访问文章简介页试试看,出现 BibTex 按钮此部分就成功了。
魔改 2- 使用正确的接口
经过上一步后,虽然出现了按钮,但不起作用。打开控制台会出现报错信息:
看了一下脚本的源码,它发送的 POST 请求地址为:
1 https://kns.cnki.net/kns8/manage/APIGetExport
这里的接口地址我们可以改一下。之前我们提到脚本原理就是读取知网 NoteExpress 格式进行 BibTeX 的转换。这里我通过抓包,得到接口的地址:
那么我们就可以把这串地址粗暴的写进去。(注意配合通配符使用)
魔改 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) )
对应的 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) }); }) }; }) })();
后记
作者本人已顺利从天大毕业,相关校园网账号已封禁,因此无法再对此脚本进行测试与维护。欢迎天大大佬们继续改进与维护脚本。
本文参考