使用正则切分APA格式的参考引文

首页 / 科技区 / 正文

之前曾收到一批APA格式的参考文献清单,每一篇文献都单独存储在word文档的一个段落里,如下图所示。现在我想从每篇文献里提取出作者论文名期刊发表年份DOI号,顺便查阅下所处期刊的影响因子,然后整理到一个excel表里。经过实践,我发现可以用正则表达式进行处理,简单记录一下心得体会。

image-20210909195949821

读取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')

结果与小结

导出结果的截图如下:

image-20210909211701901

这样就把一段参考文献的字符串提取成了结构化的二维表,方便查看的同时也利于筛选。

评论区
头像
文章目录