之前曾收到一批APA格式的参考文献清单,每一篇文献都单独存储在word文档的一个段落里,如下图所示。现在我想从每篇文献里提取出作者、论文名、期刊、发表年份和DOI号,顺便查阅下所处期刊的影响因子,然后整理到一个excel表里。经过实践,我发现可以用正则表达式进行处理,简单记录一下心得体会。
读取word段落
先导入所有需要的库:
import re
from docx import Document
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
这里我使用了docx
库来读取段落,这个库里有一个Document
类,逐段处理的常见方法如下:
doc = Document(doc_name)
paras = doc.paragraphs
for i in range(len(paras)):
t = paras[i].text
# t......
经测试发现,尽管文档中各段之前带有编号,但用python读取这些段落时是不会带上这个数字编号的。
查询影响因子
这在上一篇博客中详细写过,可通过网页爬虫的方式实现。这里由于只有期刊名,故只需实现由期刊名查影响因子。
def get_IF_name(name):
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
}
name.replace(' ', '+')
address = "http://sci.justscience.cn/?q=" + str(name) + "&sci=1"
f = requests.get(address, headers = headers, timeout=(3,7))
soup = BeautifulSoup(f.text, features="lxml")
tds = soup.find_all(height="30")
for i in range(0, len(tds), 8):
if tds[i+1].text.upper() == name.upper():
time.sleep(1)
return tds[i+7].text
批量提取各项信息
使用pandas
库处理 excel,re
库提取各项信息。
可以直接创建一个 DataFrame,在 for 循环中依次提取段落中的各个值,然后直接 append 进去。需要注意的一个点是,我这里是将数据以字典的形式 append 进去的,这能保证列名与数据对应。
使用正则的过程并不复杂,主要是对这些字符串查找规律。例如“年份”就是括号中的四位数字;“文章名”是在年份之后,刊名之前等等。
有时部分文章会没有doi号或作者等信息,因此需要写try...except...
等。不过我这次拿到的这批参考文献倒没有这些情况。
def read_doc_reference(doc_name):
doc = Document(doc_name)
paras = doc.paragraphs
df = pd.DataFrame(
columns=['author','publish_year','title','journal','IF','DOI']
)
for i in range(len(paras)):
t = paras[i].text
try:
author = re.findall(r'([A-Za-z]+ ?[A-Za-z]* ?[A-Za-z]*-?[A-Za-z]*, [A-Z]\..*?\()',t)[0].replace('(','')
except:
author = "NONE"
publish_year = re.findall(r'(\([0-9|a-z| ]+\))',t)[0].replace('(','').replace(')','')
title = t.split('). ')[1].replace('?','.').split('.')[0]
journal = re.findall(r'.*?\)\. .*?[\.|?] (.*[,|.]?)',t)[0].split(',')[0]
IF = get_IF_name(journal)
if 'doi.org' in t:
DOI = "https://doi.org/" + t.split('org/')[1]
else:
DOI ='NONE'
data = {'author': author,
'publish_year': publish_year,
'title': title,
'journal': journal,
'IF': IF,
'DOI': DOI}
df = df.append(data, ignore_index=True)
df.to_excel('./result.xlsx')
结果与小结
导出结果的截图如下:
这样就把一段参考文献的字符串提取成了结构化的二维表,方便查看的同时也利于筛选。