知网导出的题录文件通常用于NoteExpress、EndNote等文献管理软件,想要做成表格一览无余或是Word文档怎么操作呢?

继之前写过的一篇WoS英文题录翻译整理之后,本次尝试将知网导出的题录文件整理为可读性较高的Excel和Word,可用于研究态势总览和文献筛选。

一种辅助整理WoS英文论文题录文档的方法(python-docx)https://blog.csdn.net/u014111377/article/details/126016414

目录

一、知网导出题录文件

二、Excel题录处理

三、Word题录处理

四、完整实现代码

五、使用方法


一、知网导出题录文件

选中所需论文,选择导出文献“自定义”

选择所需字段,下载为xls格式(建议选中“摘要”“年”“发表时间”等)

二、Excel题录处理

导出的题录文件打开时提示文件格式和扩展名不匹配,且浏览不便。这是由于知网导出的xls文件内部并不是Excel格式,而是html代码。

处理函数参数如下(完整代码在最后)

def cnki_processing(filenames, input_dir, output_dir, sort_by=None, ascending=True, union=False):# (文件名,输入文件夹,输出文件夹,排序列,正序True/倒序False,是否合为一个文件)

read_file()、process_excel()、process_word()为其子函数。

首先读入文件,使用BeautifulSoup进行解析html,转换为DataFrame格式。此处主要查看期刊、硕博和会议论文,排除“科技成果”类型。

def read_file(filename):  # 读入知网题录xls文件,将文件转为DataFrame# 知网导出题录的Excel文件并不是Excel格式,而是html代码,需要从中提取表格内容with open(input_dir + '\\' + filename, 'r', encoding='utf-8') as f:content = f.read()soup = BeautifulSoup(content, 'html.parser')table = soup.find('table')  # 定位到表格columns = [td.text.split('-')[-1] for td in table.find('tr')]  # 表格列名(只保留中文部分)# 将表格信息通过列表推导式形成二维列表,然后转为DataFramedf = pd.DataFrame([[td.text for td in tr] for tr in table.find_all('tr')[1:]], columns=columns)df = df[(df['来源库']!='SrcDatabase-来源库') & (df['来源库']!='科技成果')].dropna(subset='来源库')  # 去除重复表头和空行return df

处理生成Excel题录并调整格式提高可读性。此处由于经多种方法尝试,pandas输出的表头难以调整格式(可能由于版本原因,网上的方法不起作用),将表头转变为普通行以调整格式。具体步骤可见代码注释。

def process_excel(df, filenamep):  # 处理Excel函数# (上一步处理后的DataFrame,将要保存的文件名)if sort_by in df.columns:  # 指定的排序列若存在df.sort_values(by=sort_by, ascending=ascending, inplace=True)elif type(sort_by) == str:  # 列名不存在print('Warning: \'' + sort_by + '\' 不在题录文件中,未进行排序。')elif sort_by:  # 不为Noneprint('Warning: sort_by参数应为str类型,未进行排序。')df = df.reset_index(drop=True).reset_index()  # 生成序号df['index'] = df['index'] + 1  # 序号从1开始df['摘要'] = df['摘要'].map(lambda x: re.sub('^\n', '', re.sub('\n+\t*', '\n', x)))  # 摘要文本清洗,去除多余换行符和Tabcolumns = ['序号'] + df.columns.tolist()[1:]  # 整理列名,“index”替换为“序号”# 经多种方法尝试,pandas输出的表头难以调整格式,将表头转变为普通行df = pd.DataFrame([columns] + list(df.values), columns=columns)# 使用xlsxwriter输出自定义格式Excelwriter = pd.ExcelWriter(output_dir + '\\' + filenamep + '.xlsx', engine='xlsxwriter')df.to_excel(writer, sheet_name='CNKI题录', index=False, header=False)  # 由于表内已包含序号和列名,不输出DataFrame的index和表头workbook  = writer.bookworksheet = writer.sheets['CNKI题录']worksheet.set_default_row(18)  # 设置默认行高header_format = workbook.add_format({'align': 'center', 'bold': True, 'font_size': 11, 'font_name': u'微软雅黑'})  # 标题格式text_center_format = workbook.add_format({'align': 'center', 'font_size': 11, 'font_name': u'微软雅黑'})  # 文本居中格式text_format = workbook.add_format({'font_size': 11, 'font_name': u'微软雅黑'})  # 文本左对齐格式# 指定相应列的列宽和默认列宽width_dict = {'序号': 8, '来源库':8, '题名': 45, '关键词': 30, '摘要':30, '年': 8, 'default': 20}# 设置内容格式for idx, column in enumerate(columns):  # 遍历列名,idx下标用于转换Excel列索引# 列宽如有定义,使用定义数值,如无定义使用defaultwidth = width_dict[column] if column in width_dict.keys() else width_dict['default']if column in ['序号', '来源库', '发表时间', '年']:  # 这几列内容较短,居中显示worksheet.set_column(chr(65 + idx) + ':' + chr(65 + idx), width, text_center_format)  # chr将ASCII数值转换为字母列索引else:  # 其他左对齐worksheet.set_column(chr(65 + idx) + ':' + chr(65 + idx), width, text_format)worksheet.set_row(0, 18, header_format)  # 设置标题格式writer.save()  # 保存return df

整理后的效果如下(可选择是否排序、按什么字段排序)。

三、Word题录处理

如果想逐篇阅读摘要,Excel显得有些局限,因此另整理Word题录,并排版输出。

def process_word(df, filenamep):document = Document()document.styles['Normal'].font.size = Pt(12)  # 字体大小document.styles['Normal'].font.name = 'Times New Roman'  # 西文字体document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')  # 中文字体document.styles['Normal'].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY  # 两端对齐document.styles['Normal'].paragraph_format.line_spacing = 1.15  # 行距document.styles['Normal'].paragraph_format.space_before = Pt(3)  # 段前document.styles['Normal'].paragraph_format.space_after = Pt(3)  # 断后document.styles['Normal'].paragraph_format.first_line_indent = document.styles['Normal'].font.size * 2  # 首行缩进def add_heading_func(text, level, font_size, font_color=RGBColor(0, 0, 0), font_bold=True, line_spacing=1.15, first_line_indent=0, space_before=6, space_after=6, en_font='Times New Roman', cn_font='宋体'):# 增加标题函数,可能由于版本问题直接改样式不起作用,这里使用h、r2个变量来调整标题格式,分别是paragraph和run格式h = document.add_heading(level=level)r = h.add_run(text)r.font.size = Pt(font_size)  # 字体大小r.font.color.rgb = font_color  # 字体颜色r.font.bold = font_bold  # 加粗r.font.name = en_font  # 西文字体r._element.rPr.rFonts.set(qn('w:eastAsia'), cn_font)  # 中文字体if level == 0:  # 如果为大标题,居中,西文字体同中文字体h.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTERr.font.name = cn_fontelse:  # 其他标题两端对齐h.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFYh.paragraph_format.first_line_indent = r.font.size * first_line_indent  # 首行缩进h.paragraph_format.line_spacing = line_spacing  # 行距h.paragraph_format.space_before = Pt(space_before)  # 段前h.paragraph_format.space_after = Pt(space_after)  # 段后add_heading_func(filenamep, 0, 16, cn_font='微软雅黑')for i in df.loc[1:, ['序号', '来源库', '题名', '作者', '文献来源', '摘要', '年']].values:  # 循环遍历题录表格add_heading_func(str(i[0]) + '. '+ i[2] + '(' + re.sub(';$', '', i[3]) + ',' + (str(i[6]) if i[6] else '网络首发') + ')', 1, 12, font_color=RGBColor(0x4f, 0x81, 0xbd))document.add_paragraph('来源:' + i[4] + '('+ i[1] + ')')for j in i[5].split('\n'):document.add_paragraph(re.sub('^ *', '', j))document.add_paragraph()document.save(output_dir + '\\' + filenamep + '.docx')  # 保存文件

效果如下。

四、完整实现代码

# -*- coding: utf-8 -*-
import os
import re
import time
import pandas as pd
from bs4 import BeautifulSoup
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qndef now():return time.strftime('%H:%M:%S', time.localtime())def cnki_processing(filenames, input_dir, output_dir, sort_by=None, ascending=True, union=False):# (文件名,输入文件夹,输出文件夹,排序列,正序True/倒序False,是否合为一个文件)def read_file(filename):  # 读入知网题录xls文件,将文件转为DataFrame# 知网导出题录的Excel文件并不是Excel格式,而是html代码,需要从中提取表格内容with open(input_dir + '\\' + filename, 'r', encoding='utf-8') as f:content = f.read()soup = BeautifulSoup(content, 'html.parser')table = soup.find('table')  # 定位到表格columns = [td.text.split('-')[-1] for td in table.find('tr')]  # 表格列名(只保留中文部分)# 将表格信息通过列表推导式形成二维列表,然后转为DataFramedf = pd.DataFrame([[td.text for td in tr] for tr in table.find_all('tr')[1:]], columns=columns)df = df[(df['来源库']!='SrcDatabase-来源库') & (df['来源库']!='科技成果')].dropna(subset='来源库')  # 去除重复表头和空行return dfdef process_excel(df, filenamep):  # 处理Excel函数# (上一步处理后的DataFrame,将要保存的文件名)if sort_by in df.columns:  # 指定的排序列若存在df.sort_values(by=sort_by, ascending=ascending, inplace=True)elif type(sort_by) == str:  # 列名不存在print('Warning: \'' + sort_by + '\' 不在题录文件中,未进行排序。')elif sort_by:  # 不为Noneprint('Warning: sort_by参数应为str类型,未进行排序。')df = df.reset_index(drop=True).reset_index()  # 生成序号df['index'] = df['index'] + 1  # 序号从1开始df['摘要'] = df['摘要'].map(lambda x: re.sub('^\n', '', re.sub('\n+\t*', '\n', x)))  # 摘要文本清洗,去除多余换行符和Tabcolumns = ['序号'] + df.columns.tolist()[1:]  # 整理列名,“index”替换为“序号”# 经多种方法尝试,pandas输出的表头难以调整格式,将表头转变为普通行df = pd.DataFrame([columns] + list(df.values), columns=columns)# 使用xlsxwriter输出自定义格式Excelwriter = pd.ExcelWriter(output_dir + '\\' + filenamep + '.xlsx', engine='xlsxwriter')df.to_excel(writer, sheet_name='CNKI题录', index=False, header=False)  # 由于表内已包含序号和列名,不输出DataFrame的index和表头workbook  = writer.bookworksheet = writer.sheets['CNKI题录']worksheet.set_default_row(18)  # 设置默认行高header_format = workbook.add_format({'align': 'center', 'bold': True, 'font_size': 11, 'font_name': u'微软雅黑'})  # 标题格式text_center_format = workbook.add_format({'align': 'center', 'font_size': 11, 'font_name': u'微软雅黑'})  # 文本居中格式text_format = workbook.add_format({'font_size': 11, 'font_name': u'微软雅黑'})  # 文本左对齐格式# 指定相应列的列宽和默认列宽width_dict = {'序号': 8, '来源库':8, '题名': 45, '关键词': 30, '摘要':30, '年': 8, 'default': 20}# 设置内容格式for idx, column in enumerate(columns):  # 遍历列名,idx下标用于转换Excel列索引# 列宽如有定义,使用定义数值,如无定义使用defaultwidth = width_dict[column] if column in width_dict.keys() else width_dict['default']if column in ['序号', '来源库', '发表时间', '年']:  # 这几列内容较短,居中显示worksheet.set_column(chr(65 + idx) + ':' + chr(65 + idx), width, text_center_format)  # chr将ASCII数值转换为字母列索引else:  # 其他左对齐worksheet.set_column(chr(65 + idx) + ':' + chr(65 + idx), width, text_format)worksheet.set_row(0, 18, header_format)  # 设置标题格式writer.save()  # 保存return dfdef process_word(df, filenamep):document = Document()document.styles['Normal'].font.size = Pt(12)  # 字体大小document.styles['Normal'].font.name = 'Times New Roman'  # 西文字体document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')  # 中文字体document.styles['Normal'].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY  # 两端对齐document.styles['Normal'].paragraph_format.line_spacing = 1.15  # 行距document.styles['Normal'].paragraph_format.space_before = Pt(3)  # 段前document.styles['Normal'].paragraph_format.space_after = Pt(3)  # 断后document.styles['Normal'].paragraph_format.first_line_indent = document.styles['Normal'].font.size * 2  # 首行缩进def add_heading_func(text, level, font_size, font_color=RGBColor(0, 0, 0), font_bold=True, line_spacing=1.15, first_line_indent=0, space_before=6, space_after=6, en_font='Times New Roman', cn_font='宋体'):# 增加标题函数,可能由于版本问题直接改样式不起作用,这里使用h、r2个变量来调整标题格式,分别是paragraph和run格式h = document.add_heading(level=level)r = h.add_run(text)r.font.size = Pt(font_size)  # 字体大小r.font.color.rgb = font_color  # 字体颜色r.font.bold = font_bold  # 加粗r.font.name = en_font  # 西文字体r._element.rPr.rFonts.set(qn('w:eastAsia'), cn_font)  # 中文字体if level == 0:  # 如果为大标题,居中,西文字体同中文字体h.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTERr.font.name = cn_fontelse:  # 其他标题两端对齐h.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFYh.paragraph_format.first_line_indent = r.font.size * first_line_indent  # 首行缩进h.paragraph_format.line_spacing = line_spacing  # 行距h.paragraph_format.space_before = Pt(space_before)  # 段前h.paragraph_format.space_after = Pt(space_after)  # 段后add_heading_func(filenamep, 0, 16, cn_font='微软雅黑')for i in df.loc[1:, ['序号', '来源库', '题名', '作者', '文献来源', '摘要', '年']].values:  # 循环遍历题录表格add_heading_func(str(i[0]) + '. '+ i[2] + '(' + re.sub(';$', '', i[3]) + ',' + (str(i[6]) if i[6] else '网络首发') + ')', 1, 12, font_color=RGBColor(0x4f, 0x81, 0xbd))document.add_paragraph('来源:' + i[4] + '('+ i[1] + ')')for j in i[5].split('\n'):document.add_paragraph(re.sub('^ *', '', j))document.add_paragraph()document.save(output_dir + '\\' + filenamep + '.docx')  # 保存文件if union:  # 如需合并为一个文件dfs = [pd.concat([read_file(filename) for filename in filenames])]  # 读入文件转为DataFrame并合并filenameps = ['合并题录_' + time.strftime('%Y%m%d_%H%M%S', time.localtime())]  # 输出文件名else:  # 单独文件dfs = [read_file(filename) for filename in filenames]  # 读入文件转为DataFramefilenameps = ['.'.join(filename.split('.')[:-1]) for filename in filenames]  # 输出文件名(去除后缀)for df, filenamep in zip(dfs, filenameps):  # 遍历待处理DataFrame和输出文件名df = process_excel(df, filenamep)  # 运行处理Excel函数process_word(df, filenamep)print(now(), filenamep, '处理完成')input_dir = '知网题录文件'  # 输入文件夹
output_dir = '输出文件夹'  # 输出文件夹if not os.path.exists(output_dir):  # 输出文件夹如不存在os.mkdir(output_dir)  # 创建filenames = [filename for filename in os.listdir(input_dir) if filename.split('.')[-1] == 'xls']  # 筛选xls文件
cnki_processing(filenames, input_dir, output_dir, sort_by='发表时间', ascending=True, union=False)  # 执行
# cnki_processing函数参数列表:(filenames文件名,input_dir输入文件夹,output_dir输出文件夹,sort_by排序列,ascending正序True/倒序False,union是否合为一个文件)

五、使用方法

将知网导出的xls题录文件放入程序同目录的输入文件夹运行。

cnki_processing函数参数列表:(filenames文件名,input_dir输入文件夹,output_dir输出文件夹,sort_by排序列,ascending正序True/倒序False,union是否合为一个文件)

filenames由程序遍历输入文件夹得到,input_dir和output_dir在上方变量中设置;sort_by为排序列,留空不排序;ascending为排序方式(正序True/倒序False);union为True时将输入文件夹内所有xls文件合并为一个Excel和Word题录,为False时每个文件单独生成一个Excel和Word。

一种辅助整理知网论文题录文档的方法(Excel、Word)相关推荐

  1. 数据库结构文档生成(支持Excel,Word,HTML,MD格式)

    这是一款导出Mysql数据表到Excel表格的小程序 项目下载地址 已上传项目地址 效果图 ####excel格式 ####WORD格式 ####MD格式 项目初始化步骤: 1.配置applicati ...

  2. endnote x9使用方法_一文掌握 Endnote 核心功能使用方法

    使用文献管理软件去整理文献和在写作科研论文时引用参考文献,是科研工作者的必备技能.Endnote 则是最常用的文献管理软件之一. Endnote 的功能十分强大,其中有很多高级功能也需要我们掌握.但是 ...

  3. 解除Word文档保护方法汇总

    解除 Word 文档保护方法汇总 Word 的文档保护分为打开保护和修改保护,现在我们来讨论如何解除修改保护.前两种方法是我从网上找到的,第三种是自己想的,感觉超级简单实用. 版本 :Office 2 ...

  4. 中国知网论文查重算法和修改攻略

    现在高校对于硕士和博士论文采用的检测系统,是由知网开发的.但该软件的具体算法,判定标准,以前一直不清楚, 本文是从知网内部工作人员哪里拿到的,揭示了知网反抄袭检测系统的算法,如何判定论文是抄袭,以及如 ...

  5. 【转】知网论文反抄袭检测系统的算法与修改秘籍

    现在高校对于硕士和博士论文采用的检测系统,是由知网开发的.但该软件的具体算法,判定标准,以前一直不清楚, 本文是从知网内部工作人员哪里拿到的,揭示了知网反抄袭检测系统的算法,如何判定论文是抄袭,以及如 ...

  6. 知网论文检测表格是否在查重范围内?

    一篇论文不仅由文字组成,还包含表格.图片.公式等.它是由许多因素组成的.那么,知网论文中的查重表是否属于查重范围呢? 首先,知网的系统效率很高.当我们上传一篇论文到知网,系统会自动去除文章的格式,转换 ...

  7. Python 爬虫中国知网论文过程中遇到的坑及解决办法

    假期,老师给布置了 Python 爬虫中国知网论文的任务,目前实现了登录和搜索功能,先写一下遇到的坑和解决办法吧. Python 爬虫中国知网论文过程中遇到的坑及解决办法 一. selenium 模块 ...

  8. 知网搜论文没有服务器响应,CNKI知网论文检测使用中的十四个常见问题

    原标题:CNKI知网论文检测使用中的十四个常见问题 1.初检段落A未发现抄袭,复检的时候A段怎么又发现抄袭了? 这是因为系统设置的阈值有关,大概3%左右的阀值:也就说每次大概3%左右重复内容不能检测出 ...

  9. 知网论文免费下载,请速度存好!

    文 |AI_study 今天一大早以前课题组的大佬,突然给我发消息,说在知网下载了我的硕士论文.并花费了 15 大洋! 卧槽,真心血亏啊.对于我们已经毕业离校的,偶尔要下载论文没办法像在学校那样子可以 ...

最新文章

  1. java 深拷贝 流_(转)Java技巧:深拷贝的两种方式
  2. SAP QM 执行事务代码QS51维护使用决策的选择集,系统报错 – Transaction no longer valid for catalog ‘3’ -
  3. 推荐开发工具系列之--FireGestures(火狐手势命令)
  4. linux命令——pwd
  5. Centos6.5下docker 环境搭建
  6. 码神之路博客项目构建记录
  7. 《Python编程快速上手——让繁琐工作自动化》——第一部分 Python编程基础 第1章 Python基础 1.1 在交互式环境中输入表达式...
  8. uboot 分析之 启动流程
  9. TypeScript class 的访问控制
  10. datatable如何生成级联数据_如何把Excel表数据批量生成条形码
  11. php中颜色的索引值,PHP imagecolorsforindex - 取得某索引的颜色
  12. 卷积神经网络中的池化方法(pooling)总结
  13. 【教程搬运】廖雪峰Git的使用教程(一)
  14. 第三十七课.宽度学习
  15. 图书馆管理信息系统可行性分析
  16. 陈风莲(帮别人名字作诗)
  17. JQ ajax 请求事件处理
  18. 计算机房电器设备功率密度,WP155_R0_数据中心空间和功率密度需求的计算.pdf
  19. mysql计算连续天数_mysql 统计连续天数
  20. Shapely——基础操作汇总

热门文章

  1. WPF中获取Canvas中控件的坐标方法
  2. CAD小白要怎么查看CAD图纸呢?像建筑CAD图纸怎么快速查看呢?
  3. 已知收到的汉明码(按配偶原则配置)为1100111、1100001,检查上述代码是否出错?
  4. mount修改/dev/shm的大小
  5. 在家怎么赚钱?五个在家就能做的项目,做好了都能赚钱!
  6. m=m(m-1)的含义
  7. 华章计算机拍了拍你,并送来了8月书单(上)
  8. 安卓端小黄鸟抓包,请求注入
  9. 浅谈PCB生产干膜与应用工艺
  10. firebird 连接 lazarus