Skip to content
Phone animation 宇宙尽头的餐馆

用 Zotero 快速生成精简文献报告并导出为 Markdown

· 3 min

Zotero 是管理文献的利器,但默认报告往往包含大量无关信息。为提升效率,我借助 ChatGPT 编写了一段代码,只提取文献中的关键信息,如标题、作者和摘要,并导出为 Markdown 和 CSV 格式。

准备工作#

  1. 在 Zotero 中选择想要导出的文献。
  2. 右键点击并选择“导出条目报告”功能。
  3. 使用 Command + S(Mac)或 Ctrl + S(Windows)保存 HTML 文件。
  4. 准备运行下面的代码。

完整代码#

以下是完整的处理代码,包括从 HTML 文件中提取标题、作者、摘要、日期和期刊信息,去除摘要中的回车符,以及将提取的信息保存为 Markdown 和 CSV 文件的功能。请确保您已经安装了所需的库:beautifulsoup4pandas

Terminal window
pip install pandas
pip install beautifulsoup4

如果你在安装过程中遇到任何权限问题,可能需要在命令前加上sudo(对于macOS或Linux)或使用管理员模式打开命令行界面(对于Windows)。

这里只提取类别为 item journalArticle 的条目,如果要提取学位论文需要加上 item thesis

接下来就可以运行代码了,使用前请将 html 文件放在 py 文件一个路径下。

# 导入必要的库
from bs4 import BeautifulSoup # 用于解析HTML文件
import pandas as pd # 用于处理和保存数据
# 定义函数从HTML文件中提取信息
def extract_info_from_html(file_path):
# 打开并读取HTML文件
with open(file_path, 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file, 'html.parser') # 创建BeautifulSoup对象解析HTML
# 初始化一个空列表存储所有文章的信息
articles_info = []
# - 通过`find_all`方法查找所有类为`item journalArticle`的`li`标签,每个`li`标签代表一篇文章。
# 论文类别为item thesis
articles = soup.find_all('li', class_='item journalArticle')
# 遍历每篇文章,提取所需信息
for article in articles:
title = article.find('h2').text.strip() # 提取标题
# 提取所有作者名称,每个作者在td标签中,且td标签之前有一个含有"class='author'"的th标签
authors = [td.text.strip() for td in article.find_all('td') if td.find_previous_sibling('th', class_='author')]
# 提取摘要信息,如果没有找到摘要,则返回"摘要信息未提供"
abstract = article.find('th', text='摘要').find_next_sibling('td').text.strip() if article.find('th', text='摘要') else "摘要信息未提供"
abstract = abstract.replace('\n', ' ') # 去除摘要中的回车符,保证文本连贯
# 提取日期信息,如果没有找到日期,则返回"日期信息未提供"
date = article.find('th', text='日期').find_next_sibling('td').text.strip() if article.find('th', text='日期') else "日期信息未提供"
# 提取期刊信息,如果没有找到期刊,则返回"期刊信息未提供"
journal = article.find('th', text='期刊').find_next_sibling('td').text.strip() if article.find('th', text='期刊') else "期刊信息未提供"
# 将提取的信息作为字典添加到列表中
articles_info.append({
'标题': title,
'作者': ', '.join(authors),
'摘要': abstract,
'日期': date,
'期刊': journal
})
return articles_info # 返回包含所有文章信息的列表
# 定义函数将提取的信息保存为Markdown文件
def save_to_markdown(articles_info, md_file_path):
markdown_content = "" # 初始化Markdown内容字符串
# 遍历每篇文章的信息,生成Markdown格式文本
for article in articles_info:
markdown_content += f"### 标题: {article['标题']}\n"
markdown_content += f"#### 作者: {article['作者']}\n"
markdown_content += f"#### 日期: {article['日期']}\n"
markdown_content += f"#### 期刊: {article['期刊']}\n"
markdown_content += f"#### 摘要: \n{article['摘要']}\n\n---\n\n"
# 将Markdown内容写入指定的文件
with open(md_file_path, 'w', encoding='utf-8') as md_file:
md_file.write(markdown_content)
# 定义函数将提取的信息保存为CSV文件
def save_to_csv(articles_info, csv_file_path):
# 将提取的信息转换为DataFrame
df_articles = pd.DataFrame(articles_info)
# 将DataFrame保存为CSV文件
df_articles.to_csv(csv_file_path, index=False, encoding='utf-8-sig')
# ----------------需要填写的信息--------------------
# 示例使用:指定文件路径(当前路径下)
file_path = 'Zotero_报告.html' # HTML文件路径
md_file_path = 'output.md' # Markdown文件保存路径
csv_file_path = 'output.csv' # CSV文件保存路径
# 执行提取和保存操作
articles_info = extract_info_from_html(file_path) # 提取信息
save_to_markdown(articles_info, md_file_path) # 保存为Markdown
save_to_csv(articles_info, csv_file_path) # 保存为CSV
print("提取和保存完成。") # 完成提示

验证#

如果出现问题可以尝试运行以下验证

验证提取的第一条信息#

file_path = 'path/to/your/Zotero_报告.html' # 替换为您的文件路径
articles_info = extract_info_from_html(file_path)
print(articles_info[:1]) # 打印第一篇文章的信息作为示例

验证总数#

# 现在我们有了整个文件的所有文章信息,这里显示提取的文章数量作为确认
len(articles_info)

效果预览#

Markdown 文件预览#

图片描述

CSV 文件预览#

图片描述

优化:排序#

尝试了一下用 python 代码排序,但是对于格式不一致的日期处理有些麻烦。不如把下好的 csv 文件拿 excel 处理好再转为易读的 markdown 格式用于在 pad 或者手机上摸鱼(

import pandas as pd
# 定义读取CSV文件和转换为Markdown的函数
def read_csv_and_convert_to_markdown(csv_file_path, markdown_file_path):
# 读取CSV文件
data = pd.read_csv(csv_file_path)
# 定义转换函数,按照特定格式来转换数据
def convert_to_markdown_custom_format(df):
markdown_content = ""
for index, row in df.iterrows():
markdown_content += f"### 标题: {row['标题']}\n"
markdown_content += f"#### 作者: {row['作者']}\n"
markdown_content += f"#### 日期: {row['日期']}\n"
markdown_content += f"#### 期刊: {row['期刊']}\n"
markdown_content += f"#### 摘要: \n{row['摘要']}\n\n---\n\n"
return markdown_content
# 使用定义的格式转换数据
markdown_content = convert_to_markdown_custom_format(data)
# 将Markdown内容保存到文件中
with open(markdown_file_path, 'w', encoding='utf-8') as file:
file.write(markdown_content)
print(f"Markdown file has been saved to {markdown_file_path}")
# 指定CSV文件路径和将要保存的Markdown文件路径
csv_file_path = 'Zotero_报告提取.csv' # 请替换为您的CSV文件路径
markdown_file_path = 'Zotero_Report_Extracted_Custom.md' # 请替换为您想要保存Markdown文件的路径
# 调用函数
read_csv_and_convert_to_markdown(csv_file_path, markdown_file_path)
print("转换和保存完成。") # 完成提示